题目中说了,只能向东或向南走,也就是向右或向下走,那么点(x,y)只能由其上面的点(x-1,y)和左边的点(x,y-1)转移而来,那么设f[i][j]为走到第i行第j列时所摘的花生数,那么转移方程就是f[i][j] = max(f[i-1][j],f[i][j-1]) + g[i][j],具体请看代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 110;
int g[N][N],n,m;
int f[N][N];
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",&g[i][j]),f[i][j] = 0;
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]) + g[i][j];
printf("%d\n",f[n][m]);
}
return 0;
}