描述
童童回老家游玩,帮助奶奶摘花生,来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。童童只能向东或向南走,不能向西或向北走。问童童最多能够摘到多少颗花生。
输入描述
第一行是一个整数 T,代表一共有多少组数据。1≤T≤100
接下来是 T 组数据。
每组数据的第一行是两个整数,分别代表花生苗的行数 n 和列数 m (1≤n,m≤100)
每组数据的接下来 n 行数据,从北向南依次描述每行花生苗的情况。每行数据有 m 个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目 c(0≤c≤1000)。
输出描述
输出只有一行,为童童能摘到得最多的花生颗数。
样例输入 1
2 2 2 1 1 3 4 2 3 2 3 4 1 6 5
样例输出 1
8 16
#include<iostream>
using namespace std;
int a[105][105],n,x,y;
int dp[105][105];
int main(){
cin>>n;
while(n--){
cin>>x>>y;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(x==1) dp[i][j]=dp[i][j-1]+a[i][j];
else if(y==1) dp[i][j]=dp[i-1][j]+a[i][j];
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
cout<<dp[x][y]<<endl;
}
return 0;
}
空间优化版如下
#include<iostream>
using namespace std;
int a[105][105],n,x,y;
int dp[105];
int main(){
cin>>n;
while(n--){
cin>>x>>y;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(i==1) dp[j]=dp[j-1]+a[i][j];
else if(j==1) dp[j]=dp[j]+a[i][j];
else dp[j]=max(dp[j],dp[j-1])+a[i][j];
}
}
cout<<dp[y]<<endl;
}
return 0;
}