【DP】【JZOJ】小明在边塞

小明在边塞

有一个 n m n*m 的矩阵,从左上角到右下角,
如果是 0 0 则值不变
如果是 1 1 1 -1
如果是 2 2 + 1 +1
求到达 ( n , m ) (n,m) 后最大为多少

样例输入
5 5
0 1 1 1 1
0 1 2 1 0
0 2 0 1 1
0 0 2 0 0
0 0 0 0 0 
样例输出
2

思路

DP
记得判断边界

#include<iostream>
#include<cstdio>
using namespace std;
long long f[5005][5005];
int n,m,k;
int main()
{
	freopen("b.in","r",stdin);
	freopen("b.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			scanf("%d",&k);
			if(i==1)f[i][j]=f[i][j-1];
			else if(j==1)f[i][j]=f[i-1][j];
			else f[i][j]=max(f[i-1][j],f[i][j-1]);//判断边界
			if(k==1)f[i][j]=f[i][j]-(long long)1;
			else if(k==2)f[i][j]=f[i][j]+(long long)1;//判断是否要加1或减1
		}
	}
	printf("%lld",f[n][m]);
	fclose(stdin);
	fclose(stdout);
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/86609725