因为题目中没有说是否是正整数,导致我们以为是DP,没敢做。。。太可惜了,不过现场赛绝对不会出现这种情况,毕竟所有的提问是都可以看见的。
题意:告诉一个矩阵,然后求从(1,1)到(n,m)能走过的最大和。
分析:如果行或者列是奇数,就可以全部遍历。否则就会只空出一个数的位置,这个位置一定在奇数行的偶数列,或者偶数行的奇数列[ (0~n-1//\\0~m-1) ]。
偶数行奇数列 奇数行偶数列
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define _cle(m, a) memset(m, a, sizeof(m))
#define repu(i, a, b) for(int i = a; i < b; i++)
#define repd(i, a, b) for(int i = b; i >= a; i--)
#define sfi(n) scanf("%d", &n)
#define pfi(n) printf("%d\n", n)
#define MAXN 100010
int main()
{
int n,m,a;
while(~scanf("%d%d",&n,&m))
{
int sum = ,minn = MAXN,x = ,y = ;
repu(i,,n)
repu(j,,m)
{
scanf("%d",&a);
sum += a;
///只比较偶数行,奇数列或者奇数行偶数列位置上的数字
if(minn > a && (i+j)%)
{
x = i;
y = j;
minn = a;
}
}
//cout<<minn<<" "<<x<<" "<<y<<endl;
if (n%==)
{
printf("%d\n",sum);
repu(i,,n/)
{
repu(j,,m-)
putchar('R');
putchar('D');
repu(j,,m-)
putchar('L');
putchar('D');
}
repu(j,,m-)
putchar('R');
}
else if (m%==)
{
printf("%d\n",sum);
repu(i,,m/)
{
repu(j,,n-)
putchar('D');
putchar('R');
repu(j,,n-)
putchar('U');
putchar('R');
}
repu(j,,n-)
putchar('D');
}
else
{
printf("%d\n",sum - minn);
repu(i,,x/)
{
repu(j,,m-)
putchar('R');
putchar('D');
repu(j,,m-)
putchar('L');
putchar('D');
}
repu(j,,y/)
putchar('D'),putchar('R'),putchar('U'),putchar('R');
if (x%==)
putchar('R'),putchar('D');
else
putchar('D'),putchar('R');
repu(j,y/+,m/)
putchar('R'),putchar('U'),putchar('R'),putchar('D');
repu(i,x/+,n/)
{
putchar('D');
repu(j,,m-) putchar('L');
putchar('D');
repu(j,,m-) putchar('R');
}
}
puts("");
}
return ;
}
/*
空了个3
6 6
1 13 14 15 20 21
16 12 11 10 22 23
9 8 7 6 24 26
5 4 3 2 25 27
28 29 30 31 32 33
34 35 36 17 18 19
*/