动态规划总结

动态规划通常应用于最优化问题,即要做出一组选择以达到一个最优解。在做选择的同时,经常出现同样形式的子问题。当某一特定的子问题可能出自于多于一种选择的集合时,动态规划是很有效的。关键技术是存储这些子问题每一个的解,以备它重复出现。

和分治法一样,动态规划是通过组合子问题的解而解决整个问题的。动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。

  动态规划通常应用于最优化问题。此类问题可能有很多种可行解。每个解有一个值,而我们希望找出一个具有最优值的解。称这样的解为该问题的"一个"最优解。

  动态规划算法的设计可以分为如下4个步骤:

  1)描述最优解的结构。

  2)递归定义最优解的值。

  3)按自底向上的方式计算最优解的值。

  4)由计算出的结果构造一个最优解。

题目一:

  装配线调度问题。

  步骤1:通过工厂最快路线的结构

  动态规划方法的第一个步骤是描述最优解的结构的特征。对于装配线调度问题,可以如下执行。考虑底盘从起始点到装配站S1,j 的最快可能路线。如果j=1,则底盘能走的只有一条路线,所以很容易就可以确定它到装配站S1,j 花费了多少实际时间。对于j=2,3,...,n,则有两种选择:这个底盘可能从装配站S1,j-1 直接到装配站 S1,j 在相同的装配线上,从装配站j-1到j的时间是可以忽略的。或者,这个底盘可能来自装配站S2,j-1,然后再移动到装配站S1,j ,移动的代价是t2,j-1 。我们将分别考虑这两种可能性,后面可以看到它们之间其实有很多共性的。(找到递推公式)

  首先,假设通过装配站S1,j 的最快路径通过了装配站S1,j -1。关键的一点是这个底盘必定是利用了最快的路线从开始点到装配站S1,j -1。

  类似地,假设通过装配站S1,j 的最快路径通过了装配站S2,j -1。

  更一般地,对于装配线调度问题,一个问题的(找出装配站Si,j 的最快路线)的最优解包含了子问题(找出通过S1,j -1S2,j -1 的最快路线)的一个最优解。我们称这个性质为最优子结构,这是是否可以应用动态规划方法的标志之一。

  下面利用最优子结构来说明:观察一条通过装配站S1,j的最快路线,会发现它必定是经过装配线1或2上的装配站j-1.因此,通过装配站S1,j的最快线路只能是一下二者之一:

  通过装配站S1,j -1的最快线路,然后直接通过装配站S1,j 。

  通过装配站S2,j -1的最快线路,从装配线2移动到装配线1,然后通过装配站S1,j 

  利用对称的推理思想,通过装配站S2,j的最快路线,也只能是二者之一。

  通过装配站S2,j -1的最快线路,然后直接通过装配站S2,j 。

  通过装配站S1,j -1的最快线路,从装配线1移动到装配线2,然后通过装配站S2,j 

  为了解决这个问题,即寻找通过任一条装配线上的装配站j的最快路线,我们解决它的子问题,即寻找通过两条装配线上的装配站j-1的最快路线。

  所以,对于装配线调度问题,通过建立子问题的最优解,就可以建立原问题某个实例的一个最优解了。

  步骤2:一个递归的解

  在动态规划方法中,第二个步骤是利用子问题的最优解来递归定义一个最优解的值。对于装配线的调度问题,对于装配线的调度问题,我们选择在两条装配线上通过装配站j的最快线路作为子问题,j=1,2...,n。令fi[j]表示一个底盘从起点到装配站S1,j的最快可能时间。

  我们的最终目标是确定底盘通过工程的所有路线的最快时间,记为f*。底盘必须一路经由装配线1或2通过装配站n,然后到达工厂的出口。所以:

  f* = min{f1[j] + x1, f2[j] + x2}

  然后开始考虑边界条件。

  要对f1[1] 和f2[2]进行推理也很容易的。不管在哪一条装配线上通过装配站1,底盘都是直接到达该装配站的。于是

  f1[1] = e1 + a1,1

  f2[2] = e2 + a2,1

  正式考虑:

  现在来考虑如何计算f1[j],其中j=2,3,...,n(i = 1,2)。

  第一种情况f1[j] = f1[j - 1] + a1,j

  第二种情况f1[j] = f2[j - 1] + t2,j-1 + a1,j

  同理:

  对于第二条装配线: 

  第一种情况f2[j] = f2[j - 1] + a1,j

  第二种情况f2[j] = f1[j - 1] + t1,j-1 + a2,j

考虑边际情况和一般情况后得出递归公式:

  略

时间: 2024-08-26 14:54:15

动态规划总结的相关文章

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re

动态规划(4)——最长上升子序列(作业题NYOJ201)

作业题 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科-- 今天他们的Teacher S,给他们出了一道作业题.Teacher S给了他们很多的点,让他们利用拉格朗日插值公式,计算出某严格单调函数的曲线.现在小白抄下了这些点,但是问题出现了,由于我们的小白同学上课时走了一下神,他多抄下来很多点,也就是说这些点整体连线不一定还是严格递增或递减的了.这可怎么处理呢.为此我们的小白同学制定了以下的取点规则: 1.取

动态规划之矩阵连乘

[问题描述] 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2-,n-1.如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次.