动态规划算法是比较实用的算法之一,结合实际问题能更好的熟悉这个算法
下面以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.代码如下

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int main(void)
  5. {
  6. int Max[105][105], ap[105][105],i,j,n;
  7. cin >> n;
  8. for (i = 1; i <= n; i++)
  9. for (j = 1; j <= i; j++)
  10. cin >> ap[i][j];
  11. for (j = 1; j <= n; j++)
  12. Max[n][j] = ap[n][j];
  13. for (i = n - 1; i >= 1; --i)
  14. for (j = 1; j <= i; ++j)
  15. Max[i][j] = max(Max[i + 1][j + 1], Max[i + 1][j]) + ap[i][j];
  16. cout << Max[1][1] << endl;
  17. return 0;
  18. }

动态规划(一)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. js图片上传并预览

    <form id="addpic" class="easyui-form" method="post" enctype="m ...

  2. vuex深入浅出

    本文主要记录使用vuex的使用场景.重要组成部分和学习心得. 1.说在前面 学习vue有两周的时间了,目前已经对vue的基础使用比较熟悉了.但是一直对vuex的使用耿耿于怀,这么说是因为总是不太理解, ...

  3. vue+axios+easy-mock+element-ui实现表格分页功能

    废话不多,效果如图: LineSource.vue文件内代码如下: <template> <div class="c-main auth userControl" ...

  4. 模拟Spring框架

    BeanFactory package com.bjsxt.spring; public interface BeanFactory { public Object getBean(String na ...

  5. SVN学习——简单入门之创建仓库、导入、检出(一)

    从刚刚参加工作就开始使用svn,清晰的记得那年师姐比较生气的来找我:“你怎么又不更新就提交代码了,把我写的都给覆盖掉了”,哈哈~ 虽然一直在用svn,不过在日常工作中主要用到的是简单的操作,而且大多数 ...

  6. memcached与spring集成

    一.背景 销售CRM(项目A)将负责管理项目信息系统(项目B)的支付与权限 上级要求为避免频繁调用CRM接口,中间放一级缓存,但要做到缓存中保证最新数据 因项目B已使用memcache作缓存,所以决定 ...

  7. 【NLP_Stanford课堂】正则表达式

    或者 [Ww]oods,方括号里的是或的关系,符合其一即被提出.用来匹配单个字符 [A-Z]:表示所有的大写字母之一 [a-z]:表示所有的小写字母之一 [0-9]:表示所有的0-9的数字之一 否定: ...

  8. 我的HTML总结之表单

    表单是Web中实现交互的重要方法,用于收集用户信息并提交给服务器.   表单中的9大控件 <input type="text" name="key" va ...

  9. Perl实用中文处理步骤(修改版)

    发信人: FenRagwort (泽), 信区: Perl标  题: Perl实用中文处理步骤(修改版)发信站: 水木社区 (Mon Feb 14 12:52:14 2011), 转信 (修改版 感谢 ...

  10. nutz 结合QueryResult,Record 自定义分页查询,不构建pojo 整合

    public QueryResult getHistoryIncome(int d, int curPage) throws Exception { /**sql**/ Sql sql = Sqls. ...