Instructions

综上所述(好像没有上)我的DP真的垃圾的一批。。。 动态规划是用来避免重复计算状态导致效率低的情况,实现动规有记忆化搜索和填表两种方法,但记忆化搜索不能优化空间,所以常用的是填表法。

下面是几种非常简单的动规经典问题。


背包问题

一、0/1背包问题
每个物品只有一个,考虑选与不选,状态转移方程为f(i,j)=max(f(i-1,j),f(i-1,j-a[i])+w[i])。当然也可以用滚动数组对空间进行优化,倒着循环,状态转移方程为f(j)=max(f(j),f(j-a[i])+w[i])。

当然关于边界条件,f(i,0)=0,表示第i种物品用0个装0的价值,f(0,j)=-inf,表示不可能的情况,这种就当然不会选到了。
这个烂东西记忆化搜索才过得去。。。

二、部分背包问题
这是个贪心问题,每次选择平均价值最大的装进去。

void workk(){for(int i=1;i<=n;i++){thi[i].ww=(double)thi[i].w/(double)thi[i].a;}sort(thi+1,thi+n+1);int x=0;for(int i=1;i<=n;i++){x+=thi[i].a;if(x>k){int y=thi[i].a-x+k;anss+=(y*thi[i].ww);}else anss+=(double)thi[i].w;if(x>=k)break;}
}

三、多重背包
可以化成0/1背包。

四、完全背包
可以化成0/1背包,个数为k/a[i]。

五、满背包
状态转移的第二重循环多了必须要>0的限制条件,并且全部初始化为-inf,这样就不会转移到没装满的情况了。

memset(f,-inf,sizeof(f));f[0]=0;for(int i=1;i<=n;i++){for(int j=c;j>=0&&j>=v[i];j--){f[j]=max(f[j],f[j-v[i]]+p[i]);}}

六、K背包问题
三重循环,考虑选选与不选,只是每个要选k个。

memset(f,-inf,sizeof(f));for(int i=0;i<=20000;i++){f2[0][i]=0;}for(int i=1;i<=n;i++){for(int j=k;j>=1;j--){for(int m=c;m>=v[i];m--)f[j][m]=max(f[j][m],f[j-1][m-v[i]]+p[i]); }}

七、多费用背包
这个类型的问题有承重和体积两个限制条件,所以状态就是第i种物品在承重为k,体积为j的情况下的价值最大,用滚动数组优化空间,三重循环。

八、多背包问题
此类问题就是分别考虑第i个物品装入第一个背包和装入第二个背包的状态。


LIS和LCS

关于LIS:最长上升子序列
设置一个状态数组记录以j结尾的序列里最长上升子序列的长度,最后再取这些状态里的最大值。(n方做法)
设置一个mark数组,如果当前a[i]>mark[len],那么将mark[len+1]赋值为a[i],否则lower_bound操作返回a[i]的位置,然后把mark[len]赋值为a[i]。这样就能保证字典序最小并且len最大。(nlogn做法)

关于LCS:最长公共子序列
把S2这个序列映射成一个新序列,映射的方法是公共元素存成该元素在S1里的序号,非公共元素存成0。然后在新序列上LIS,当然,碰到0的时候跳过就行了。


序列型动态规划

一、最大连续和 设置一个状态数组表示以a[n]结尾的数的最大连续和,再取max,n方。 二、最长抖动序列 设置两个状态f,g,表示升序的抖动序列的长度和降序的抖动序列的长度。大于的元素f的转移是max(f(i-1),g(i-1)+1),小于的元素g的转移是g(i)=max(f(i-1)+1,g(i-1))。


转载于:https://www.cnblogs.com/virtual-north-Illya/p/10045324.html

关于简单动态规划(Dynamic Programming)的总结相关推荐

  1. 运筹学状态转移方程例子_动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 规划论 Mathematical Programming / Mathematical Optimization In mathematics, computer ...

  2. 动态规划 dynamic programming

    动态规划dynamic programming June,7, 2015 作者:swanGooseMan 出处:http://www.cnblogs.com/swanGooseMan/p/455658 ...

  3. 动态规划(Dynamic Programming)的一些事一些情

    References <算法导论> 最近在回顾算法的知识,特将一些动态规划的重点记录下来,好让以后自己不要忘记. 基本概念 动态规划(Dynamic Programming,简称为DP,下 ...

  4. 动态规划|Dynamic Programming

    由于最近课设要用动态规划,翻阅资料学习一下. 动态规划 解决复杂问题的方法,把它们分解成更简单的子问题. 一旦我们看到一些例子,这个定义就有意义了.实际上,我们今天只看解问题的例子 解决DP问题的步骤 ...

  5. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  6. [欠驱动机器人]4,动态规划(Dynamic Programming)

    目录 前言 控制问题变成优化问题 新增成本(Additive cost) 图搜索的最优控制 连续动力学方程 HJB 方程 求出最小控制 数值求解J 方程逼近与数值迭代 线性方程逼近 网格上的值迭代 连 ...

  7. 算法导论-动态规划(dynamic programming)

    动态规划:通过组合子问题的解来解决整个问题. 动态规划的四个步骤: 1)描述最优解的结构: 2)递归定义最优解的值: 3)按自低向上的方式计算最优解的值(首先找到子问题的最优解,解决子问题,最后找到问 ...

  8. 算法初探-动态规划(Dynamic Programming)

    编程之中接触到很多关于算法的知识,想来整理一番,算是对自己记忆的一个提醒 1.Coin11Problem  问题为:使用最少的三种面值为1,3,5的硬币组合出11元. 重要的是状态以及状态转移方程 d ...

  9. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

最新文章

  1. 共享文件夹加密专家_文件加密软件哪家靠谱?
  2. 红星美凯龙牵手新潮传媒抢夺社区消费市场
  3. js php调用webservice,php调用web services两种方法soap和curl
  4. 在windows上搭建redis集群(Redis-Cluster)
  5. oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例
  6. java ppt控件_Java版PPT操作控件Spire.Presentation v3.3.5新版来袭!支持转换GroupShape到图片...
  7. [每天一个知识点]20-Java语言-菱形运算符
  8. 【BZOJ】1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
  9. excel的主要功能_勤哲EXCEL服务器软件做装饰企业管理系统ERP
  10. ASP+Access+Dreamweaver+IIS搭建简单数据库管理系统_第一章_前言
  11. [下载]最新QQ空间牧场开通器 V2.0
  12. 【券后价16.80元】【海蓝蓝】夹心海苔脆芝麻海苔即食罐装海苔宝宝辅食儿童零食40克...
  13. [工业互联-2]:工业有线互联总线之CAN总线
  14. 一个关于随机矩阵谱范数的不等式
  15. 这些成人世界的“黑话”,你能听懂多少?
  16. /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
  17. 思途旅游CMS短信宝短信插件
  18. 管管我吧,我很听你的话
  19. NYIST_ACM Ranking List FAQ
  20. 【C++】面试题目,整理自牛客网

热门文章

  1. Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
  2. mysql5.5数据库权限知识补充
  3. Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)
  4. 12.super关键字
  5. UVA 10917 Walk Through the Forest
  6. 私人定制---打造属于自己的linux小系统
  7. java 手动线程调度_Java Thread 多线程 操作线程
  8. 【数据平台】Centos下仅CPU安装TensorFlow
  9. Ubuntu配置远程访问的xrdp协议和teamviewer软件
  10. VS2015占内存大吗?_手机是6GB运行内存,何为后台却显示3G内存?