f(i, j) 表示从(1, 1)走到(i, j) 的所有走法集合,存储集合中的路线中能够拿到的最大的花生数目。
f(i, j) 可以被不重不漏的分成两个部分:
- 从i - 1, j向南走一步到i, j的所有走法
- 从i, j - 1向东走一步到i, j的所有走法
所以有:(f(i, j) = max(f(i - 1, j), f(i, j - 1)) + f(i, j))
#include<iostream>
using namespace std;
const int N = 110;
int f[N][N];
int r, c;
int main(){
int T;
cin >> T;
while(T --){
cin >> r >> c;
for(int i = 1; i <= r; i ++)
for(int j = 1; j <= c; j ++)
cin >> f[i][j];
for(int i = 1; i <= r; i ++)
for(int j = 1; j <= c; j ++)
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + f[i][j];
cout << f[r][c] << endl;
}
return 0;
}