【题目描述】
Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。
【输入】
第一行是一个整数TT,代表一共有多少组数据。1≤T≤1001≤T≤100
接下来是TT组数据。
每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C(1≤R,C≤100)C(1≤R,C≤100)
每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有CC个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M(0≤M≤1000)M(0≤M≤1000)。
【输出】
对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。
【输入样例】
2 2 2 1 1 3 4 2 3 2 3 4 1 6 5
【输出样例】
8 16
#include<stdio.h> struct jj { int a, b; int c[100][100]; int dp[100][100]; int max; }stu[100]; int Max(int a, int b) { if (a > b) return a; else return b; } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d%d", &stu[i].a, &stu[i].b); for (int j = 0; j < stu[i].a; j++) { for (int k = 0; k < stu[i].b; k++) { scanf("%d", &stu[i].c[j][k]); } } } for (int i = 0; i < n; i++) { stu[i].dp[0][0] = stu[i].c[0][0]; for (int j = 1; j < stu[i].a; j++) { stu[i].dp[j][0] = stu[i].dp[j - 1][0] + stu[i].c[j][0]; } for (int j = 1; j < stu[i].b; j++) { stu[i].dp[0][j] = stu[i].dp[0][j - 1] + stu[i].c[0][j]; } for (int j = 1; j < stu[i].a; j++) { for (int k = 1; k < stu[i].b; k++) { stu[i].max = Max(stu[i].dp[j - 1][k], stu[i].dp[j][k - 1]); stu[i].dp[j][k] = stu[i].max + stu[i].c[j][k]; } } } for (int i = 0; i < n; i++) { printf("%d\n", stu[i].dp[stu[i].a - 1][stu[i].b - 1]); } return 0; }
一本通 1284:摘花生
最新推荐文章于 2024-05-07 23:10:32 发布