动态三角形(动态规划思想入门)

个人心得:动态规划是一种隶属于决策学的一个算法思想,他能够很好的解决多阶段决策问题,这种思想对于我们的生活还是科研都是必不可少的,

需要好生体会,学会动态方程的转移,做到具体问题具体分析。

那这简单题目来看吧,动态三角形,很明显从第一个开始就可以看出来第一个等于下面俩个对角线中最大与自己相加,所以可以用递归完成,

当然还有种更加巧妙的就是从后面往前面走,你可以很明显看到从倒数第二行开始他的最大值应该等于下俩个对角线中的最大值加上自己本身。

所以方程可以这么表示

DP[i][j]=max(DP[i+1][j],DP[i+1][j+1])+map[i][j];(1=<i<=n-1)这是从后面递推的

map[i][j] if(i==n)

dp(i,j)=

max(dp(i+1,j),dp(i+1,j+1))+map[i][j];这是递归方程式

73   88   1   02   7   4   44   5   2   6   5

(Figure 1)

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

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

Sample Output

30
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iomanip>
 6 #include<algorithm>
 7 using namespace std;
 8 int mapa[105][105];
 9 int dp[105][105];
10 int n;
11 int dps(int x,int y){
12     if(dp[x][y]!=-1) return dp[x][y];
13     if(x==n)
14     {
15         dp[x][y]=mapa[x][y];
16         return dp[x][y];
17     }
18     return dp[x][y]=max(dps(x+1,y),dps(x+1,y+1))+mapa[x][y];
19
20 }
21 int main()
22 {
23     cin>>n;
24     for(int i=1;i<=n;i++)
25         for(int j=1;j<=n;j++)
26             dp[i][j]=-1;
27     for(int i=1;i<=n;i++)
28         for(int j=1;j<=i;j++)
29              cin>>mapa[i][j];
30         cout<<dps(1,1)<<endl;;
31
32 }
				
时间: 2024-10-07 12:54:52

动态三角形(动态规划思想入门)的相关文章

『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规划算法简单说,利用拆解问题思想,定义问题状态和状态之间的关系,使得问题能够以递推或者是分治的方式去解决. 动态规划算法的基本思想与分治法很相似,将待求解的问题分解为若干个子问题,前一子问题的解,为后一子问题的求解所依赖.在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解

Maximum Product Subarray动态规划思想

该题即是昨天没有做出来的题目,想了很久,想出了一个普通的做法,提交发现超时了.思想是新建一个数组,保存每个元素与后面的元素相乘后得到的最大值,然后再在该数组中选出最大的值,返回.[笨死 发现行不通后决定还是求教度娘了. 果然大神无处不在,该题可运用动态规划思想解决.考虑到正负数相乘后会出现的各种结果,采取保存局部最小和局部最大值的方式.列出公式: int a=localmin*A[i] int b=localmax*A[i] localmin = min(A[i],min(a,b)) local

经典算法宝典——动态规划思想(六)(2)

1.01背包问题 有N件物品和一个容量为V的背包,第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 解析: 这是最基础的背包问题,特点是每种物品仅有一件,可以选择放或不放.用子问题定义状态,即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.其状态转移方程便是f[i][v] = max{f[i-1][v], f[i-1][v-c[i]]+w[i]},这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的,所以有必要将它详细解

动态规划思想:石子合并问题

描述:在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分. 贪心算法不能得到最优解,可惜了.首先我们可以把这么堆石子看成一列 如果N-1次合并的全局最优解包含了每一次合并的子问题的最优解,那么经这样的N-1次合并后的得分总和必然是最优的.因此我们需要通过动态规划算法来求出最优解. 在此我们假设有n堆石子,一字排开,合并相邻两堆的石子,

PHP+MySQL动态网站开发从入门到精通pdf

下载地址:网盘下载 <PHP+MySQL+Dreamweaver动态网站建设从入门到精通>按新手从入门到精通的学习过程,从实际的应用出发详细介绍了PHP的脚本语言基础.开发运行环境以及各种常用动态功能系统的开发.全书共10章,内容分为理论部分和实战部分,由浅入深地介绍了PHP以及相关技术,通过大量实际项目的案例,详尽地讲解了PHP的技术要点和开发过程,精选动态功能模块实例,通过实例的讲解来让读者理解PHP+MySQL的动态开发方法.全书包括用户管理系统.新闻发布系统.留言板管理系统.投票管理系

动态规划——背包问题入门

动态规划--背包问题入门 1. 01背包 概述 给出N个物品,每个物体都具有一定的体积和价值,而每个物体都只有一个. 拥有一个V体积的背包,问应如何装包才能使背包中物体的总价值最大? 解题思路 背包问题是典型的动态规划类题目,而动态规划是典型的通过规律找出正解的方法.所以解题思路的关键在于如何寻找不同数据之间的关系(状态转移). 直接描述不方便解释,我们以例题为例: (注:01背包问题不涉及因为物体的形状.大小等而如何放入背包的问题,只是单纯考虑体积和价值.我们可以理解成每个物体都是液体,而这个

卡特兰数计算 动态规划思想

卡特兰数问题:1. 有一个无限大的栈,一共n个元素,请问有几种合法的入栈出栈形式? 2. 排队买电影票的问题,有2n个人排队买票,其中有n个人只有一张50元纸币,另外n个人只有一张100元的硬币,售票员没有零钱,问这2n个人应该怎样排队,才能使得不冲突,每个人都能买到票. 3. 矩阵A1A2A3......An相乘,求所有可能的相乘顺序,括号如何放置. 4. 值由1~n的n个节点构成的二叉树搜索树的个数? 以上这些都是卡特兰数问题:h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...

01背包 -- 动态规划的入门题目

<strong><span style="font-size:18px;">首先说什么是动态规划: 经常听到 DP: Dynamic Programming的缩写 这里的入门题是这样的: 01背包 有重量与价值分别为Wi 和 Vi的 n 个物品.请从中选出物品,在重量综合不超过w的前提下,求出价值最大的. 样例: input: n = 4 (w, v) = {(2.3), (1, 2), (3, 4), (2, 3)} W = 5 outtput: 7(选择的是

动态规划思想详解及示例实现

本文以两个具体例子详细剖析动态规划算法设计思想,主要参考圣经<算法导论>,加上自己的一些理解,主要是附上了一些具体实现过程,所以希望能对大家有所帮助. #_*_ coding:utf-8 _*_ import numpy as np def MemoizedCutRodAux(p,n,r,s): if r[n]>=0: return r[n] if n==0: q=0 c=0 else: q=-1 c=-1 for i in range(1,n+1): if q<(p[i]+Mem