浅谈动态规划

基本思路

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能
会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

基本思想

1. 多阶段决策问题

如果一类活动过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策(采取措施),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题 。
各个阶段的决策构成一个决策序列,称为一个策略。每一个阶段都有若干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果 [5] 。

2.动态规划问题中的术语

阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。在多数情况下,阶段变量是离散的,用k表示。此外,也有阶段变量是连续的情形。如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的。

状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。

无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。从某一阶段以后的线路开始,当这段的始点给定时,不受以前线路(所通过的点)的影响。状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。

决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择(行动)称为决策。在最优控制中,也称为控制。在许多问题中,决策可以自然而然地表示为一个数或一组数。不同的决策对应着不同的数值。描述决策的变量称决策变量,因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史。

决策变量的范围称为允许决策集合

策略:由每个阶段的决策组成的序列称为策略。对于每一个实际的多阶段决策过程,可供选取的策略有一定的范围限制,这个范围称为允许策略集合。

允许策略集合中达到最优效果的策略称为最优策略

给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k),u(k))与x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。这是从k阶段到k+1阶段的状态转移规律,称为状态转移方程

最优化原理:作为整个过程的最优策略,它满足:相对前面决策所形成的状态而言,余下的子策略必然构成“最优子策略”。

最优性原理实际上是要求问题的最优策略的子策略也是最优。

使用条件

任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。

1、最优化原理(最优子结构性质)

最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。

2、无后效性

将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性 。

3、子问题的重叠性

动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。

——摘自百度百科

例题

洛谷P1004 方格取数

题面
题解

洛谷P1057 传球游戏

题面
题解

最长公共子序列长度 题解

题目描述

字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。

令给定的字符序列x=“x0,x1,…,xn−1”x=“x0,x1,…,xn-1”x=“x0,x1,…,xn−1”, 序列Y=“y0,y1,…,yk−1Y=“y0,y1,…,yk-1Y=“y0,y1,…,yk−1是XXX的子序列,存在XXX的一个严格递增下标序 列<i0,i1,…,ik−1><i0,i1,…,ik-1><i0,i1,…,ik−1>,使得对所有的j=0,1,…,k−1j=0,1,…,k- 1j=0,1,…,k−1,有xij="yjxij="yjxij="yj。

例如,$x=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
对给定的两个字符序列,求出他们最长的公共子序列长度。

输入

第1行为第1个字符序列,都是大写字母组成,以”.”结束。长度小于5000。

第2行为第2个字符序列,都是大写字母组成,以”.”结束,长度小于5000。

输出

输出上述两个最长公共子序列的长度。

样例输入

ABCBDAB.

BACBBD.

样例输出

4

设当前的最长公共子序列长度为f[i][j]f[i][j]f[i][j],

则f[i][j]f[i][j]f[i][j]一定是由f[i−1][j]f[i−1][j]f[i−1][j]和f[i][j−1]f[i][j−1]f[i][j−1]转移过来的。

如果s1[i]!=s2[j]s1[i]!=s2[j]s1[i]!=s2[j],

则f[i][j]=max(f[i−1][j],f[i][j−1])f[i][j]=max(f[i−1][j],f[i][j−1])f[i][j]=max(f[i−1][j],f[i][j−1]),

如果s1[i]==s2[j]s1[i]==s2[j]s1[i]==s2[j],

则f[i][j]=f[i−1][j−1]+1f[i][j]=f[i−1][j−1]+1f[i][j]=f[i−1][j−1]+1。

代码如下:

#include <bits/stdc++.h>
using namespace std;
string a,b;
int f[5001][5001],len1,len2;
int main(){cin>>a>>b;len1=a.size()-1;len2=b.size()-1;for(int i=1;i<=len1;i++)for(int j=1;j<=len2;j++){if(a[i-1]==b[j-1]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);else f[i][j]=max(f[i-1][j],f[i][j-1]);}printf("%d",f[len1][len2]);return 0;
}

2020.6.26
更新

  1. 洛谷P1004 方格取数
  2. 洛谷P1057 传球游戏

题解位置

未完待续…

浅谈动态规划 ——by cbw相关推荐

  1. 浅谈动态规划和分治、贪心算法的区别

    一个问题必须拥有重叠子问题和最优子结构,才能使用动态规划去解决. 一.动态规划与分治算法 分治和动态规划都是将问题分解为子问题,然后合并子问题的解得到原问题的解. 但是不用的是,分治法分解出的子问题是 ...

  2. 浅谈动态规划,贪婪,回溯算法联系

    那么看到这三种算法,你应该有所出现: 贪心法是动态规划法的特例,如0-1背包,最小代价生成树(prim算法和cruskal算法),huffman算法,以及地杰斯特拉算法. 动态规划法是一种方法,注意和 ...

  3. 计算机技术在排水领域的应用,浅谈计算机技术在市政给排水中的应用.doc

    浅谈计算机技术在市政给排水中的应用.doc 浅谈计算机技术在市政给排水中的应用 [摘要]随着科技的进步与时代的发展,计算机技术在各个领域与行业中得到了广泛应.应用计算机技术可以增加工作的科学性与准确性 ...

  4. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

  5. 计算机科学数学理论浅谈

    计算科学数学理论浅谈 以前,总是对于数学的学习嗤之以鼻,认为没有很大的实用性,这也是为何后来跨专业考研的一个重要动机,但是随着后续学习的深入,逐渐体 会到了数学在现实工作中的分量,而这种对思考的能力的 ...

  6. 浅谈信息学竞赛考场策略及程序测试

    浅谈信息学竞赛考场策略及程序测试 主题 本文作者是江苏省常州高级中学吴翼同学发布的信息学竞赛江苏省论文.内容对于大家备考十分有帮助,特分享给同学们,希望在中秋假期给大家的学习增加一点动力! 考场策略和 ...

  7. 浅谈旅行商问题(TSP问题)

    以POJ3311为例 题目描述: The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as ...

  8. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  9. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

最新文章

  1. 关于java中的字符流的一个使用例子
  2. 全国铁路查询系统_火车票查询时刻表 全国列车时刻表 火车时刻表查询系统使用说明...
  3. erlang精要(14)-列表(1)
  4. python常用库有哪些餐厅_Python常用库整理
  5. 收集SQLite中的时间日期函数[ZT]
  6. unslider.js 实现移动web轮播
  7. 成也萧何,败也萧何---PIG JOIN 的replicated
  8. 古体字与简体字对照表_简体字繁体字对照表?
  9. 计算机基础一体化教程(习题)
  10. JavaScrupt就这么回事(转)
  11. 北京市居民公共交通出行特征
  12. 你会换掉Postman吗?我正在用HTTP Client...
  13. [战略]Fans未来战略--第3篇--以文会友
  14. OpenMP Sections
  15. 天才程序员法布里·贝拉德
  16. 使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分
  17. 港府拟申拨175亿港元进行西九文化区综合地库余下工程
  18. sqlmap详细教程
  19. php创建mdb,如何用php创建一个新的.MDB文件?
  20. 无线网手动添加服务器,无线网络手动设置的问题解决v

热门文章

  1. 通俗易懂的讲解信号与系统
  2. java-php-python-ssm运动场所预约管理网站计算机毕业设计
  3. Google 常用镜像收集
  4. 计算机01无法纯随机,玄不救非,氪不改命 如何分清游戏中的“真随机”和“伪随机”?...
  5. python通过什么对象连接数据库步骤_Python连接MySQL数据库方法介绍(超详细!手把手项目案例操作)...
  6. LIDAR系列之2:用激光雷达检测车道线
  7. 从零搭建若依环境(非分离版)
  8. ECLIPSE中添加TPTP插件
  9. PLC故障排查步骤的思路和方法
  10. oracle 修改用户信息表,Oracle批量修改用户表table的表空间 | 学步园