$\LARGE\color{orange}{刷题日记(算法提高课)}$
分析过程在此不过多赘述,注意两个问题就好
-
为了避免对边界进行讨论,我们默认下标从 1 开始,并且由于数组是全局的,因此下标为 1 的值全为 0(即$\ f[0][j]\ 或\ f[i][0]\ 均为\ 0\ $)
-
本题求的是最大值,由于负数的出现并不影响,因此初始值设置成 0 是没有问题的。但如果求的是最小值,那么初始值能设置成 0
代码如下:
#include <iostream>
using namespace std;
const int N = 110;
int f[N][N], w[N][N];
int n, m;
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &w[i][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + w[i][j];
printf("%d\n", f[n][m]);
}
return 0;
}