题意:
给小疯子一个大小为 n*m 的棋盘,每个格子有都有钱,要小傻子在棋盘里面走一条一次性的路(没个格子只能走一次),从(0,0) 到(n - 1, m - 1), 还要捡起上面的钱, 要求捡到的钱加起来最多,更可怕的是要小傻子背出自己是怎么走的。
小傻子真惨,help!思路:
n 或 m 为奇数时:小傻子会走!
n 和 m 都为偶数时:诶,相邻格子为不同颜色,所有的格子的横纵坐标加起来为奇数里面不捡里面最少钱,就可以了的满足小疯子无理的要求了。
至于要怎么做,给小傻子看程序运行结果就好了。复杂度:
时间复杂度:O(n * m)
空间复杂度:O(1)代码
/* ***********************************************
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;
}