动态规划小入门

来源:互联网 发布:淘宝账户被冻结多久 编辑:程序博客网 时间:2024/04/30 08:20

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1004


动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程最优化的

法。最优化原理,把多阶段过程转化为一系列单阶段问题逐个求解,创立了解决

这类过程优化问题的新方法——动态规划。

  在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联

系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因

此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。

当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路

线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策

过程,这种问题称为多阶段决策最优化问题。每个阶段中,都求出本阶段的各个初始状

态到过程终点的最短路径和最短距离,当逆序倒推到过程起点时,便得到了全过程的最

短路径及最短距离,同时附带得到了一组最优结果。


  
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有

许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算

法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问

题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划

求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则

分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已

解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复

计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题

以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本

思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。动态规划算法基

本思想

  多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于

当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故

有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法。

  动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算

法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰

的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不

同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特

色的解题方法,而不存在一种万能的动态规划,可以解决各类最优化问题。因此在学习

时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象

力去建立模型,用创造性的技巧去求解。根据上例分析和动态规划的基本概念,可以得

到动态规划的基本模型如下:

  • (1)确定问题的决策对象。

  • (2)对决策过程划分阶段。

  • (3)对各阶段确定状态变量。

  • (4)根据状态变量确定费用函数和目标函数。

  • (5)建立各阶段状态变量的转移过程,确定状态转移方程。
下面我们看一下这道题的解题思路吧:


代码如下:

#include<stdio.h>


int main() {
int a[100][100], n, i, j;

while (scanf("%d", &n) != EOF) {

for (i=0; i<n; i++) {

for (j=0; j<=i; j++) {

scanf ("%d", &a[i][j]);

}

}
for (i=n-2; i>=0; i--) {

for (j=0; j<i+1; j++) {

if (a[i+1][j] > a[i+1][j+1]) {

a[i][j] = a[i][j] + a[i+1][j];  //动态方程;
}
else {

a[i][j] = a[i][j] + a[i+1][j+1];

}
}
}

printf ("%d\n", a[0][0]);
}

return 0;
}

原创粉丝点击