VJ链接:点击打开链接
基础DP做好了更有益~!
从中得出几个结论:
1. 背包问题所选的物品是没有相关性,是填充性质
2. LIS问题是元素之间有某种关系(多个属性则先排序某个,在依据另一个LIS)
3. TSP组合问题,一般进行状压,求元素的某种序
题目:
1. 最大M子段和
这个很像多维背包问题,有个数限制。同时我们可以发现最后这个元素只能是 i个子段中最后一个子段
dp[i][j]用来表示由前 j项得到的含i个字段的最大值,且最后一个字段以num[j]项结尾。
dp[i][j]=max(dp[i][j-1]+num[j],dp(i-1,t)+num[j]) 其中i-1<=t<=j-1.
(因为必须是以 num[j] 结尾的,所以num[j]一定属于最后一个子段,即要么自己独立成一个子段,要么与前边以num[j-1]结尾的子段联合)
所求的最后结果为 max( dp[m][j] ) 其中1<=j<=n.
因为dp[i-1][t] 出现在j之前,所以边循环边求进行优化
类似问题:以XX为结尾是这类问题的关键,恰好也是阶段。九度 最大加法和 ,LCS
2.水题
3.看清题意是完全小于,先排序好面积,然后LIS
4.求组合,TSP问题。注意先将字符串排序,求到的自然就是字典序最小的情况
5.LIS
6.背包问题,利用混合背包
7.数塔问题,阶段清晰。就是刚开始没有依据T直接建立好阶段,导致很麻烦
8.水题,注意没有12点,显示是00. 以i为结束的最优情况
9.两种方法,①:既然所有的炮弹都要被打下来,则将用的炮弹都存放起来每次用最低的那个打,贪心策略 更高的炮弹应付更高的敌人。
②:最长不降子序列,dp[i]存放到i时有多少个LIS
10.排序后LIS,先让体重有序再判断速度
11.输出路径的背包问题,关键在于每次还要回溯判断是否已经用个这个元素,编码复杂
12.LCS
13.数塔问题,可以将初始点也放入,自后向前递推即可。注意每个板子有两个点,一次下落只能到一个木板
14.LIS N^2 NlogN
15.这个刚开始没看懂题。每次只能从给出的序列两端选取,求和最大。区间dp
16.很像之前那个滑雪,转移是有条件的,于是排序再转移
17.dp[i][j] 以i,j为起点的子矩阵。从右上角往左下角递推
18.LIS变形
19.这个题难。求使得一个序列的数字变成单调的,于是与需要给某些数字加,某些减。要变成的数字必然是已有的数字(不知道为什么)
dp[i][j] 处理到i时,以j为结尾最小值。数字起先复制一份排序,这样保证了“序” dp[i][j] = min(dp[i][j],dp[i-1][mn]+abs(a[i]-b[j]);
mn是0~j-1的最小数