小明在边塞
有一个
n
∗
m
n*m
n∗m的矩阵,从左上角到右下角,
如果是
0
0
0则值不变
如果是
1
1
1则
−
1
-1
−1
如果是
2
2
2则
+
1
+1
+1
求到达
(
n
,
m
)
(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;
}