题目描述

H e l l o K i t t y Hello\ Kitty Hello Kitty想摘点花生送给她喜欢的米老鼠。

她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。

地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。

H e l l o K i t t y Hello\ Kitty Hello Kitty只能向东或向南走,不能向西或向北走。

问 H e l l o K i t t y Hello\ Kitty Hello Kitty最多能够摘到多少颗花生。

输入格式

第一行是一个整数T,代表一共有多少组数据。

接下来是T组数据。

每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。

每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M。

输出格式

对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

数据范围

1 ≤ T ≤ 100 , 1≤T≤100, 1≤T≤100,
1 ≤ R , C ≤ 100 , 1≤R,C≤100, 1≤R,C≤100,
0 ≤ M ≤ 1000 0≤M≤1000 0≤M≤1000

输入样例:

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

输出样例:

8
16

算法

动态规划
定义:定义 f [ i , j ] f[i, j] f[i,j]为从 ( 1 , 1 ) (1,1) (1,1)走到 ( i , j ) (i,j) (i,j)可以摘到的最大花生数量
状态转移:因为每次可以向右边走,向下面走,所以我们把这个状态划分为两种(按前一步的操作划分),一种是从左边走过来(向右),另一种是从上面走过来(向下)。
因为从左走的最大花生数为 f ( i , j − 1 ) f(i ,j - 1) f(i,j−1),从上走的最大花生数为 f ( i − 1 , j ) f(i - 1,j) f(i−1,j),这两个取 M a x Max Max就得到上一步的最大值,然后再加上本格的花生数量就行了。得出以下的状态转移方程

f ( i , j ) = max ⁡ ( f ( i , j − 1 ) , f ( i − 1 , j ) ) f\left(i,j\right)\ =\ \max\left(f\left(i,j-1\right),f\left(i-1,j\right)\right) f(i,j) = max(f(i,j−1),f(i−1,j)),得出代码

#include <bits/stdc++.h>using namespace std;const int N = 1010;
int f[N][N], t;int read() {int x = 0, f = 1; char c = getchar();for(; !isdigit(c); c = getchar()) f = (c == '-') ? -1 : 1;for(;  isdigit(c); c = getchar()) x = x * 10 + c - 48;return x * f;
}int main()
{t = read();while (t -- ){int n = read(), m = read();for(int i = 1; i <= n; i ++ )for(int j = 1; j <= m; j ++ )f[i][j] = max(f[i - 1][j], f[i][j - 1]) + read();printf("%d\n", f[n][m]);}return 0;
}

这个在提高课中被分到了“数字三角形模型”,那他和数字三角形的相似处在哪里?
都是线性dp,都是从两个地方转移过来,甚至状态转移方程完全一样(循环不一样),所以要举一反三,融会贯通。

AcWing1015.摘花生相关推荐

  1. 1284:摘花生《信息学奥赛一本通》

    /* 1284:摘花生<信息学奥赛一本通>  http://ybt.ssoier.cn:8088/problem_show.php?pid=1284 */ #include <ios ...

  2. 2728:摘花生(数字金子塔变形)

    2728:摘花生 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图 ...

  3. AcWing 1015. 摘花生 (DP)

    1015. 摘花生 思路 状态表示:dp[i][j]表示从(1, 1)走到(i, j)的所有路线中权值最大的那条路线 状态计算(集合划分):从(1, 1)走到(i, j)的所有路线集合划分为下面两类 ...

  4. Bailian2950 摘花生【贪心】

    2950:摘花生 总时间限制: 1000ms 内存限制: 65536kB 描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:" ...

  5. 寒假每日一题题解(1.29)摘花生(DP水题)

    摘花生 Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来. 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过 ...

  6. 鲁滨逊摘花生NOIP2004

    总时间限制: 1000ms 内存限制: 65536kB 描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:"欢迎免费品尝我种 ...

  7. 2022.1.29 训练日记 6 AcWing 1015. 摘花生

    题目链接:摘花生 题目分析: 0.该题是一道线性DP(数字三角形模型). 1.状态表示集合:定义f[i][j]为从(1, 1)到达(i, j)的所有方案属性:最大值 2.状态转移(i, j)从(i-1 ...

  8. AcWing 1015. 摘花生

    Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来. 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生 ...

  9. 摘花生(信息学奥赛一本通-T1284)

    [题目描述] Hello Kitty想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经 ...

最新文章

  1. C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针
  2. UVA12633 Super Rooks on Chessboard
  3. nginx 403 Forbidden
  4. sql server版本 性能_迁移到高版本 SQL 数据库后,性能变差了
  5. 个人管理 - Learn More,Study Less!
  6. 用数据说话,基金经理一年到底能挣多少钱?
  7. java五子棋人机对战_实现简单的人机对战五子棋(实践)
  8. VMware虚拟机(Ubuntu)添加物理串口
  9. 字符多维php递归遍历目录
  10. jQuery EasyUI/TopJUI输入框事件监听
  11. 一篇文章告诉你什么是社群运营
  12. 常见十大算法 冒泡算法
  13. 一次spinlock死锁故障的定位(太经典,收藏!)
  14. 控制面板设置java_win10系统打开java控制面板的具体技巧
  15. ECSHOP和SHOPEX快递单号查询中通插件V8.6专版
  16. 如何使用OBS开启直播
  17. 地铁怎么坐才不能做反_地铁怎么坐,地铁怎么坐才不能做反
  18. 关于Excel自动换行,不会在西文单词中间换行的问题
  19. 基于mplayer的简易影音播放器
  20. 精通脚本黑客读书笔记(一)

热门文章

  1. i5-9300H和i5-8300H 对比相差多少
  2. 如何将科技论文转化为精彩演讲? 科研人员必备能力!
  3. JS学习之全局函数与window对象
  4. adb命令(这篇文章就够了)
  5. 学习笔记:Python 面试100讲(基于Python3.x)05-python综合题
  6. 100天精通Python(基础篇)——第20天:pip命令大全
  7. idea 指定文件扩展名中搜索内容
  8. Nodejs Native AddOn的编写
  9. EXCEL函数笔记1(数学函数、文本函数、日期函数)
  10. 按字母A-Z顺序排名全国城市、带拼音