题目描述
Mickey要过生日了,Kitty想摘点花生送给Mickey。她来到一片有网格状的矩形花生田(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Kitty只能向东或向南走,不能向西或向北走。
请帮助Kitty计算一下最多能够摘到多少颗花生?
输入格式
输入文件的第一行,是一个整数T,表示测试数据的组数,1≤T≤100
对于每组测试数据:
第一行,是整个整数,分别代表花生苗的行数R和列数C(1≤R,C≤100)
接下来R行,每行C个数据,表示每株花生苗上的花生数量M(0≤M≤1000)
输出格式
对于输入的每组数据,输出一行,表示Kitty能够摘到的花生的数量
输入输出样例
输入样例1:
2 2 2 1 1 3 4 2 3 2 3 4 1 6 5
输出样例1:
8 16
【耗时限制】1000ms 【内存限制】64MB
使用动态规划,自上而下进行递推
#include<bits/stdc++.h>
using namespace std;
int a[105][105],dp[105][1005];
int main()
{
int k;
cin>>k;
while(k--)
{
int m,n;
cin>>m>>n;
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) cin>>a[i][j];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
cout<<dp[m][n]<<endl;
}
return 0;
}