洛谷 P1508 Likecloud-吃、吃、吃
这道题题好像写麻烦了
因为道路从上到下和从下到上是一样的
所以可以从上推到下,然后按照水牛开始位置输出结果。
我是直接模拟水牛的移动,代码多了些。
然后记住memset是必要的,不要省略,可能有负的情况
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 212;
int map[MAXN][MAXN], f[MAXN][MAXN], n, m;
int main()
{
scanf("%d%d", &n, &m);
_for(i, 1, n)
_for(j, 1, m)
scanf("%d", &map[i][j]);
memset(f, 0xc0, sizeof(f));
int st = (m + 1) / 2;
f[n][st-1] = map[n][st-1];
f[n][st] = map[n][st];
f[n][st+1] = map[n][st+1];
int ans = map[n][st];
for(int i = n - 1; i >= 1; i--)
_for(j, 1, m)
{
f[i][j] = max(f[i+1][j-1], max(f[i+1][j], f[i+1][j+1])) + map[i][j];
if(i == 1) ans = max(ans, f[i][j]);
}
printf("%d\n", ans);
return 0;
}