【手把手带你刷好题】—— 62.数字三角形(递推、简单DP)

举报
安然无虞 发表于 2022/05/26 22:43:41 2022/05/26
【摘要】 【前言】 今天是刷题打卡第62天! 记得加油哦。   原题:数字三角形(递推、简单DP) 原题链接:[USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷 题目描述:  输入格式: 第一个行一个正整数 n ,表示行的数目。...

【前言】

今天是刷题打卡第62天!

记得加油哦。

 

原题:数字三角形(递推、简单DP)

原题链接:[USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷

题目描述: 

输入格式:

第一个行一个正整数 n ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式:

单独的一行,包含那个可能得到的最大的和。

数据范围:

1 ≤ n ≤ 1000,三角形数字值在 [0,100] 范围内。 

示例:

输入:


  
  1. 5
  2. 7
  3. 3 8
  4. 8 1 0
  5. 2 7 4 4
  6. 4 5 2 6 5

输出:

30
 

思路:

本题采用倒推的方式:

假设func[i][j]表示的是从 i, j 到最后一层的最大路径之和

当从顶层沿某条路径走到第i层向第i+1层前进时,我们的选择是沿其下两条可行路径中最大数字的方向前进,所以找出递推关系:func[i][j] += max(func[i+1][j],func[i+1][j+1]);
注意:func[i][j]表示当前数字的值,func[i+1][j]和func[i+1][j+1]分别表示从i+1,j、i+1,j+1到最后一层的最大路径之和;
最终func[0][0]就是所求

代码执行:


  
  1. #include<stdio.h>
  2. #include<algorithm>
  3. using namespace std;
  4. int func[1005][1005] = {0};
  5. int main()
  6. {
  7. int n = 0;
  8. scanf("%d", &n);
  9. int i = 0;
  10. int j = 0;
  11. for(i = 0; i < n; i++)
  12. {
  13. for(j = 0; j <= i; j++)
  14. {
  15. scanf("%d", &func[i][j]);
  16. }
  17. }
  18. //假设func[i][j]表示的是从i, j到最后一层的最大路径之和
  19. //找出递推关系:func[i][j]+=max(func[i+1][j],func[i+1][j+1]);
  20. //func[i][j]表示当前数字的值,func[i+1][j]和func[i+1][j+1]分别表示从i+1,j、i+1,j+1到最后一层的最大路径之和
  21. //最终func[0][0]就是所求
  22. for(i = n - 2; i >= 0; i--)
  23. {
  24. for(j = 0; j <= i; j++)
  25. {
  26. func[i][j] += max(func[i+1][j], func[i+1][j+1]);
  27. }
  28. }
  29. printf("%d\n", func[0][0]);
  30. return 0;
  31. }

结语

今天是刷题打卡第62天!

加油吧少年。

 

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/122009547

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。