洛谷 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;
}

 

posted @ 2018-09-07 21:22  Sugewud  阅读(123)  评论(0编辑  收藏  举报