JDOJ 1671
Number Triangles
https://neooj.com/oldoj/problem.php?id=1671
题目描述
考虑在下面被显示的数字金字塔.
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大.
每一步可以走到左下方的点也可以到达右下方的点.
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入
第一个行包含 R(1<= R<=1000) ,表示行的数目.
后面每行为这个数字金字塔特定行包含的整数.
所有的被供应的整数是非负的且不大于100.
输出
单独的一行包含那个可能得到的最大的和.
样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
来源
真的是动态规划最经典最基础最裸的一道题了
这里讲一下动态规划(DP大法)
动态规划的概念: 多阶段决策过程的优化问题时,具有最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐步求解,这类过程优化解决多阶段决策的方法叫做动态规划。 动态规划的性质: 1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。 2.无后效性将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态得到当前最优的解。换句话说,过去的步骤只能通过当前的状态来影响未来的发展,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响,简单的说,就是“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。 适用动态规划的问题必须满足最优化原理和无后效性。
动态规划的过程: 动态规划相当于把一个问题划分成若干个部分,对于每个部分分别进行计算,然后得到全局最优解。从一个状态经过一个阶段到达另一个状态,就叫做状态转移。而状态转移过程中,我们常常要在很多的可选择途径中找到一个最优的,这个选择的过程就叫做策略。
4大要素
状态 初值 转移 answer
Code:
#include<bits/stdc++.h> using namespace std; int a[1100][1100],f[1100][1100],ans; int main() { int r; scanf("%d",&r); for(int i=1;i<=r;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]); for(int i=1;i<=r;i++) for(int j=1;j<=i;j++) f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j]; for(int i=1;i<=r;i++) if(f[r][i]>=ans) ans=f[r][i]; cout<<ans; return 0; }