题意
就是一个矩阵(n*m)
0表示值不变
1表示值为-1
2表示值为 1
求一条值最大的路径((1,1)—>(n,m))(只能往下或往右走)
样例
输入
2 2
0 1
2 0
输出
1
思路
DP,记得要判断边界
代码
#include<cstdio>
#include<iostream>
using namespace std;
int N, M, a[505][505], f[505][505];
inline bool check(int x, int y) {
return (x > 0 && x <= N && y > 0 && y <= M);
}//判断有没有出界
int main() {
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j) {
scanf("%d", &a[i][j]);
f[i][j] = -1e9;
if (a[i][j] == 1) a[i][j] = -1;
if (a[i][j] == 2) a[i][j] = 1;
}
f[1][1] = a[1][1];
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j) {
if (check(i, j-1)) f[i][j] = f[i][j-1];//取左边的值
if (check(i-1, j)) f[i][j] = max(f[i][j], f[i-1][j]);//取上面和左边两个之间的最大值
f[i][j] += a[i][j];//加上自己的值
}
printf("%d\n", f[N][M]);
}