一本通的同學???
【題目描述】
Hello Kitty想摘點花生送給她喜歡的米老鼠。她來到一片有網格狀道路的矩形花生地(如下圖),從西北角進去,東南角出來。地裡每個道路的交叉點上都有種着一株花生苗,上面有若幹顆花生,經過一株花生苗就能摘走該它上面所有的花生。Hello Kitty隻能向東或向南走,不能向西或向北走。問Hello Kitty最多能夠摘到多少顆花生。
【輸入】
第一行是一個整數T,代表一共有多少組資料。1≤T≤100
接下來是T組資料。
每組資料的第一行是兩個整數,分别代表花生苗的行數R和列數 C(1≤R,C≤100)
每組資料的接下來R行資料,從北向南依次描述每行花生苗的情況。每行資料有C個整數,按從西向東的順序描述了該行每株花生苗上的花生數目M(0≤M≤1000)。
【輸出】
對每組輸入資料,輸出一行,内容為Hello Kitty能摘到得最多的花生顆數。
【輸入樣例】
2
2 2
1 1
3 4
2 3
2 3 4
1 6 5
【輸出樣例】
8
16
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t,n,m,f[1000][1000];
int main()
{
cin>>t;
for(int k=1;k<=t;++k){
memset(f,0,sizeof(f));
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>f[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
if(i==j and i==1) continue;//邊界
if(i==1) f[i][j]+=f[i][j-1];//考慮邊界
else if(j==1) f[i][j]+=f[i-1][j];//也是考慮邊界
else f[i][j]+=max(f[i-1][j],f[i][j-1]);
}
cout<<f[n][m]<<endl;
}
return 0;
}