摘花生
Posted malcolmmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摘花生相关的知识,希望对你有一定的参考价值。
- 描述
- 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<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; const int MAXN=1e2+10; int R,C; int nuts[MAXN][MAXN]; int maxNum[MAXN][MAXN]; int main() { // freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--){ scanf("%d %d",&R,&C); for(int i=0;i<R;i++){ for(int j=0;j<C;j++){ scanf("%d",&nuts[i][j]); } } maxNum[R-1][C-1]=nuts[R-1][C-1]; for(int k=C-2;k>=0;k--){ maxNum[R-1][k]=maxNum[R-1][k+1]+nuts[R-1][k]; } for(int k=R-2;k>=0;k--){ maxNum[k][C-1]=maxNum[k+1][C-1]+nuts[k][C-1]; } for(int i=R-2;i>=0;i--){ for(int j=C-2;j>=0;j--){ maxNum[i][j]=max(maxNum[i+1][j],maxNum[i][j+1])+nuts[i][j]; } } printf("%d ",maxNum[0][0]); } return 0; }
以上是关于摘花生的主要内容,如果未能解决你的问题,请参考以下文章