状态表示:f[i][j]
表示从(1,1)
走到(n,m)
所有路径集合的最大值
状态计算:
考虑前一步,若前一步是从左边走过来的,则f[i][j]=f[i-1][j]+w[i][j]
,
若前一步是从上边走过来的,则f[i][j]=f[i][j-1]+w[i][j]
综合起来:f[i][j]=max(f[i-1][j]+w[i][j],f[i][j-1]+w[i][j])
该题是最大值问题,不用考虑边界问题
#include<iostream>
#include<cstdio>
using namespace std;
const int N=110;
int w[N][N],f[N][N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
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]+w[i][j],f[i][j-1]+w[i][j]);
}
printf("%d\n",f[n][m]);
}
return 0;
}