hdu 5396 Expression ||2015 Multi-University Training Contest 9 || 简单模拟

hdu 5396 请戳

  1. 题意:
    给小疯子一个大小为 n*m 的棋盘,每个格子有都有钱,要小傻子在棋盘里面走一条一次性的路(没个格子只能走一次),从(0,0) 到(n - 1, m - 1), 还要捡起上面的钱, 要求捡到的钱加起来最多,更可怕的是要小傻子背出自己是怎么走的。
    小傻子真惨,help!

  2. 思路:
    n 或 m 为奇数时:小傻子会走!
    n 和 m 都为偶数时:诶,相邻格子为不同颜色,所有的格子的横纵座标加起来为奇数里面不捡里面最少钱,就可以了的满足小疯子无理的要求了。
    至于要怎么做,给小傻子看程序运行结果就好了。

  3. 复杂度:
    时间复杂度:O(n * m)
    空间复杂度:O(1)

  4. 代码

/* ***********************************************
Author        :Ilovezilian
Created Time  :2015/8/18 17:16:13
File Name     :1007_1.cpp
************************************************ */

#include <bits/stdc++.h>
#define INF 0x7fffffff
using namespace std;
const int N = 0, mod = 1e9+7;


void solve()
{
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        int mx, my, mv = INF, sum = 0, x;
        for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++)
        {
            scanf("%d", &x);
            sum += x;
            if((i + j) & 1 && x < mv) mv = x, mx = i, my = j;
        }

        //printf("mx = %d my = %d mv = %d\n", mx, my, mv);

        if(n&1)
        {
            printf("%d\n", sum);

            for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++) if(i != n - 1 || j != m - 1)
                printf("%c", j != m - 1 ? ( i&1 ? 'L' : 'R') : 'D');
        }
        else if(m&1)
        {
            printf("%d\n", sum);

            for(int i = 0; i < m; i ++) for(int j = 0; j < n; j ++) if(i != m - 1 || j != n - 1)
                printf("%c", j != n - 1 ? ( i&1 ? 'U' : 'D') : 'R');
        }
        else
        {
            printf("%d\n", sum - mv);

            bool di = 0; ///这个变量很重要x3。
            for(int i = 0; i < m; i ++)
            {
                if(my / 2 * 2 == i)
                {
                    for(int j = 0; j < n; j ++)
                    {

                        if(j == mx)
                        {
                            if(j != n - 1) printf("D");
                            if(j == n - 1 && i + 1 != m - 1) printf("R");
                            di = 1;
                        }
                        else if(j != n - 1)
                            printf("%s", (j + di) & 1 ? "LD" : "RD");
                        else if(j == n - 1 && i + 1 != m - 1)
                            printf("RR");
                        else 
                            printf("R");
                    }
                    i ++;
                }
                else for(int j = 0; j < n ; j ++)if(i != m - 1 || j != n - 1)
                    printf("%c", j != n - 1 ? (((i+di) & 1) ? 'U' : 'D') : 'R');
            }
        }
        printf("\n");
    }
}

int main()
{
    //freopen("","r",stdin);
    //freopen("","w",stdout);
    solve();   
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章