【算法分析】
先把数据存储到数组a[i][j],然后把经过点的数据叠加更新a[i][j],由于当前点a[i][j]只能从上边或者左边过来,所以可以推导出状态转移方程
a[i][j]=max(a[i-1][j],a[i][j-1])+a[i][j]
最后输出最后一个点a[n][m]就是所求的答案。
【参考代码】
#include <stdlib.h>
#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
int t,r,c,a[102][102],b[102][102];
int main()
{
cin>>t;
for(int i=1;i<=t;i++){
cin>>r>>c;
memset(a,0,sizeof(a));
for(int j=1;j<=r;j++)
for(int k=1;k<=c;k++)
cin>>a[j][k];
for(int j=1;j<=r;j++)
for(int k=1;k<=c;k++)
a[j][k]=max(a[j-1][k],a[j][k-1])+a[j][k];
cout<<a[r][c]<<endl;
}
return 0;
}