DP

来源:互联网 发布:2017淘宝装修教程视频 编辑:程序博客网 时间:2024/04/26 01:54


动态规划基本重点有三:子问题、状态转移、决策。

1.设有一个三角形的数塔,顶点结点为根结点,每个结点有一个整数数值。从顶点出发,在每一个结点可以选择向左下走或者向右下走,一直走到底层,要求找出一条路径,使得路径上的和最大

思路:因为每个结点可以选择向左下或者右下走,最后要求得一条路径上的和最大,那么对于每个子问题来说,当前的最优解就是加上左上和右上之中最大的那个。

2.给定两个字符串,输出两个字符串的最长公共字串长度

思路:1 2 3 4 ....i 表示第一串,1 2 3 4....j表示第二串。

决策:

当i和j的字符相等时,状态+1,当i和j字符不相等时,因为要求最长公共字串,而达到i,j的状态有3种,(i-1,j),(i-1,j-1),(i,j-1),那么就是这3种状态取最大值。

3.求一个数字序列的最大上升序列长度和最大下降序列长度

思路:这个思路比较简单,转移的时候就2种状态,要么大于,要么小于,根据需要+1或者不加。

4.一个旅行者有一个最多能装m公斤的背包,现有n件物品,它们的重量分别是w1,w2,w3,...,wn,它们的价值分别为c1,c2,c3,...,cn。若每种物品只有一件,求旅行者能获得的最大总价值。

思路:最裸的01背包,01背包的思想就是取或者不取,也是2种状态转移,数组的下标可以挂重量和物品个数,然后枚举物品枚举重量。为什么要两个循环,因为表示这个问题状态必须要物品个数和重量,他们都跟价值息息相关。但是空间是可以优化的,不需要开物品个数,因为当新的物品加入时,状态dp[w]是从状态dp[w-当前物品重量]转移过来的,dp[w-当前物品重量]表示不加该物品时的最优解,该状态加上该物品的价值和状态dp[w]相比,决策就是谁大取谁,我们可以发现w-当前物品重量必然小于w,因此枚举重量的时候从最大重量开始枚举就可以了。比如说物品为1个,重量1到m已经是最优解,当第二个物品加入,重量为wx,那么刚开始状态dp[m-wx]转移并决策到dp[m],数组仅仅覆盖了m的答案,之前的物品为1的最优解仍旧保留着。

简单总结下就是当前状态是从之前状态取了该物品和不取该物品的决策中选一个保存。dp[w-当前物品重量]+c表示之前状态取了该物品,dp[w]表示不取该物品,两者取大值。

0 0
原创粉丝点击