博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu1216][USACO1.5]数字三角形 Number Triangles
阅读量:5099 次
发布时间:2019-06-13

本文共 1095 字,大约阅读时间需要 3 分钟。

 

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

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

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大

输入输出格式

输入格式:

 

第一个行包含 R(1<= R<=1000) ,表示行的数目。

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

所有的被供应的整数是非负的且不大于100。

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
573 88 1 02 7 4 44 5 2 6 5
输出样例#1:
30

说明

题目翻译来自NOCOW。

USACO Training Section 1.5

由于此题并不是特别难,所以就不发代码了,但是思路是~~肯定会讲清楚的。

不敢相信,这道题出自IOI1999。但如果我在那个时代,我肯定也做不出来。

蒟蒻一来看到这题,大叫:“哇,这题真简单!贪心就行啦!”

但是贪心法的缺点在此题中一览无余的展现了出来:目光短浅。

如果按照贪心法思路,则:7-8-1-7-5,其和为28;

但是存在着另外一条路:7-3-8-7-5,其和为30。

所以贪心法就OUT了。。。

然后蒟蒻又想:贪心法不行,那搜索总行了吧!

结果这次蒟蒻又想错了……

在本题中,R<=1000,要是用搜索,无论是DFS还是BFS,无论怎样剪枝,只有一种结果:TLE。

所以!!!

本题最简算法就是:递推!

递推共有两种方法可以选择:顺推法和逆推法,两种方法皆可。

顺推法和逆推法实际上很好区别,顺推法是从已知条件出发,向结果推导,而逆推法则是从结果出发,一步一步地往前推导。在本题中,顺推法就是从数塔的上方出发,一直推到最底层。而逆推法就是从最底层出发,往顶层前进。

我是用顺推法的。直接就写了个两重循环。

for(int i=2; i<=n; i++)        for(int j=1; j<=i; j++) if(b[i-1][j-1]>b[i-1][j]) //因为我们要求最大值,所以要将数塔上一层最大的数加上去。 b[i][j]=b[i][j]+b[i-1][j-1]; else b[i][j]=b[i][j]+b[i-1][j]; 上面是主要部分,剩下就是什么输入输出之类的了。

转载于:https://www.cnblogs.com/Xray-luogu/p/7634434.html

你可能感兴趣的文章
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
python学习4 常用内置模块
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
ResolveUrl的用法
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
【转载】基于vw等viewport视区相对单位的响应式排版和布局
查看>>
<转>关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>