动态规划系列
来源:互联网 发布:网络女作家排行榜2016 编辑:程序博客网 时间:2024/06/14 14:19
基本思想
将一个问题分为子问题递归求解,且将中间结果保存以避免重复计算。通常可以求得子问题的最优解,且最优解的局部也是最优的。求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解。
1.背包问题
0-1背包问题
有n件物品和一个容量为 v的背包,放入第i件物品的空间消耗是
基本思路:
定义子问题:f[i][j]表示将前i个物品放入容量为j的背包中。
求解时只需考虑第i个物品放入或者不放入两种可能
则有状态转移方程:f[i][j] = max{f[i-1][j],f[i-1][j-
f[0,0...v] = 0for i <- 1 to n for j <- 0 to v if(v < c[i]) continue;//放不下第i个物品 f[i][j] = max(f[i-1][j],f[i-1][v-c[i]]+w[i])
空间优化:
由于 i 在从0 到 n的过程中,每次只以i-1的状态进行计算,我们可以考虑只用一维数组节省空间,即使用f[0…v]来保存状态,但是根据我们的状态转移方程,f[i][j] 是由f[i-1][j]与f[i-1][j-c[i]]来决定的,也就是说考虑往容量大小为j的包里放东西时,取决于i-1的状态时,j-c[i]大小容量的最优解。
j-c[i] < j, 那么在更新j状态的值时,j-c[i]状态的值要没有变过,所以j要从大到小更新。
f[0...v] <- 0for i <- 1 to n for j <- v to c[i] f[j] = max(f[j],f[j-c[i]]+w[i])
关于初始化:
如果要求背包必须装满,那么初始化因为
2.完全背包问题
同样是有n种物品,一个容量为v的包,但是每种物品可以无限件使用,放入第i种物品费用是
思路:转化为0-1背包问题,第i件物品可以无限放,但最多也就放
3.最长公共子串
给定两个字符串str1,str2,求最长公共子串
思路:
在比较str1[i]与str2[j]的时候,即以str1[i],str2[j]结尾的子串的最长公共子串,如果str1[i]==str2[j], 结果为str1[i-1]与str2[j-1]的最长公共子串加1,如果用dp[i][j]表示以str1[i],str2[j]结尾的两个字符串的最长公共子串,那么状态转移方程可以写为:
if(str1[i] == str2[j]){ dp[i][j] = dp[i-1][j-1]+1;}else dp[i][j] = 0;
4.最长公共子序列
最长公共子序列与最长公共子串不同,可以不连续
那么在状态转移方程中,在str1[i]与str2[j]如果不等,dp[i][j] 不是为0,而是等于max(dp[i-1][j],dp[i][j-1], 如下:
状态记录二维数组大小可以为dp[n1+1][n2+1], 留dp[0][0]作为初始状态
if(str1[i] == str2[j]){ dp[i][j] = dp[i-1][j-1]+1;}else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]);}
待续
- 动态规划系列
- 动态规划学习系列
- ACM动态规划系列
- 动态规划系列
- 动态规划 -- “最”系列题目
- 动态规划 之 背包系列
- 算法系列1、动态规划
- 【LeetCode系列】动态规划算法
- 笔试题-动态规划系列
- VF 动态规划系列dp入门
- 整数划分系列问题(动态规划)
- 【算法系列-5】动态规划-背包问题
- 动态规划问题系列---Labyrinth(迷宫)
- 动态规划问题系列---Disk Schedule
- 动态规划问题系列---扔玻璃珠
- 动态规划问题系列---word break问题
- 动态规划问题系列---Unique Paths II
- 算法系列—动态规划法
- 如何快速开发一款APP
- struct和typedef struct
- 5G时代最大获利者智能照明
- 网易2017春招[编程题]分饼干@Java
- 冒泡排序
- 动态规划系列
- Solr 5.0.0配置中文分词器IK Analyzer
- 小米校招笔试题(java)
- 对CocoaPods 导入的第三的操作
- 初来驾到
- 基波和谐波
- 【编程题】Java编程题五(10道)
- java反射运用在javaFX客户端中
- Java多线程(一):线程安全与不安全