动态规划算法是比较实用的算法之一,结合实际问题能更好的熟悉这个算法
下面以POJ1163为例子

1. 首先是题目大意

:在给定的一个数字三角形中找到一条自上而下的路径,路径每一步只能左下或者右下,最后使得这条路径上的数字之和最大
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30

2.题目分析

如果使用DFS从最上面的点来进行深度遍历,简单计算一下,拿上面的数字三角形来举例,会计算经过第三行的7的路径3次,最后一行的2是6次,这样存在大量的重复计算,在规定的时间里算不出来的。所以引出动态规划算法

  • 它的思想是我们从终点向起点回退,这样把求解过程分解,每一步里面对应的子问题的终点不变,但是起点会逐渐向上移动,使得上一步已经求解的问题恰好是下一步新问题的子问题,到了最后一步,求解最大的子问题就是原始问题。

放在这一题上怎么做呢?

- 首先,把所有的数字存入一个ap的二维数组中,先假定Max(x,y)表示以x,y这一个数字为起点(即ap[x][y])到可能终点里面,最大的路径数字之和。
- 接下来开始回推了,从底边开始,底边到终点自然就是本身了,接着上一行的2开始到底边就可以选择了,如果左下,那么和就是6,右下就是7,所以选择右下,即Max(4,1)=7,同理可知道Max(4,2)=12,Max(4,3)=10,Max(4,4)=10.
- 在这里,一般把当前子问题及其解成为一个状态,所以记录下当前子问题的解,是为了后面求解时使用,也就是下一个状态的发生,而从上面的推导可以找到这样的一个关于子问题目标函数的最大值之间依赖关系,也就是常说的状态转移方程
Max[i][j] = max(Max[i + 1][j], Max[i + 1][j + 1]) + ap[i][j];
-

3.代码如下

#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
int Max[105][105], ap[105][105],i,j,n;
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
cin >> ap[i][j];
for (j = 1; j <= n; j++)
Max[n][j] = ap[n][j];
for (i = n - 1; i >= 1; --i)
for (j = 1; j <= i; ++j)
Max[i][j] = max(Max[i + 1][j + 1], Max[i + 1][j]) + ap[i][j];
cout << Max[1][1] << endl;
return 0;
}

动态规划(一)POJ1163的更多相关文章

  1. 动态规划略有所得 数字三角形(POJ1163)

    在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数 ...

  2. Poj1163 The Triangle(动态规划求最大权值的路径)

    一.Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a pro ...

  3. poj-1163 动态规划

    这道题目并不能直接使用递归,因为 7(1) 7(1)         7(1) 7(1)      7(2)         7(1) 7(1)       7(3)         7(3)    ...

  4. 动态规划之数字三角形(POJ1163)

    在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 既然求目标问题是根据查表得来的,自然 ...

  5. 动态规划入门——数字三角形(Java)

    动态规划的概念对于新手来说枯燥难懂,就算看懂了,做题的时候依旧抓耳挠腮的毫无头绪,这些比较难理解的算法,还是需要根据例子来一步步学习和理解,从而熟练掌握,下面,咱们就通过一个简单的小例子来学习动态规划 ...

  6. DP----入门的一些题目(POJ1088 POJ1163 POJ1050)

    动态规划入门 DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050 (一) POJ1088,动态规划的入门级题目.嘿嘿,连题目描述都是难得一见的中文. 题目分析: 求最长 ...

  7. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  8. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  9. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

随机推荐

  1. hdu 1087 最大递增和

    思路和LIS差不多,dp[i]为i结尾最大值 #include <iostream> #include <string> #include <cstring> #i ...

  2. struts2的基本配置

    1.package标签下主要的点在namespace和name,extend上 extend 一般继承自struts-default.xml下,继承其拦截器及一些功能,这个已在本人的拦截器一文中有讲到 ...

  3. 位运算(5)——Power of Two

    判断一个整数是不是2的幂. 关键是弄明白2的幂的二进制形式只有一个1. public class Solution { public boolean isPowerOfTwo(int n) { int ...

  4. java常用API之System类

    System中代表程序所在系统,提供了对应的一些系统属性信息,和系统操作.System类不能手动创建对象,因为构造方法被private修饰,阻止外界创建对象.System类中的都是static方法,类 ...

  5. 前端小课堂 js:what is the function?

    js 函数: 概念:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 说白了就是响应用户操作所执行的代码,通过js事件触发,然后调用执行函数里代码的操作. 比如常见的用户点击事件,用户点击 ...

  6. .NET开源工作流RoadFlow-表单设计-子表

    子表即明细表 从表:与主表对应在子表. 从表主键:从表的主键. 主表字段:主表中与从来关联的字段,一般为主表的主键. 与主表关联字段:从表中与主表关联的字段. 选择之后即可在下面从表字段列表中设置每个 ...

  7. ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证

    在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证.字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数 ...

  8. Java JSONArray的封装与解析

    package com.kigang.test; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.ut ...

  9. Java NIO(六) Selector

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...

  10. App后台开发架构实践笔记

    1 App后台入门 1.1 App后台的功能 (1)远程存储数据: (2)消息中转. 1.2 App后台架构 架构设计的流程 (1) 根据App的设计,梳理出App的业务流程: (2) 把每个业务流程 ...