/*******废话部分******
发现自己做以前会的题都忘了,所以要好好总结一下,减少遗忘。
*/
/*****搜索引擎优化部分*****
高神 高神 高神 高神 高神 高神 高神 高神 高神
*/
这个专题是高神开的DP2,都是高神精心挑选的题,要认真刷。
高神开的DP2比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71636#overview
密码:shuacm
A – Barcode
题意:给你一张n*m的图,让你把它变成一张类似条形码的图,其中白色和黑色部分都要在[x,y]之间。
解法:两个状态,分别为当前列和当前颜色,保存所需的最小代价。这样就可以实现了。
总结:尽量用少的状态来实现。
B - Porcelain
题意:给你n个架子,每个架子只能从左右拿出物品。问拿出k个物品,所能取得的最大值。
解法:分步骤:第一步先求出只在一个架子取出k个的最大值。
第二步类似0-1背包,递推架子,求出最大值
总结:碰到困难的问题,分布来实现。
C – Camels
题意:给你n个点,k个驼峰,求出可能的种数。(驼峰只能由1,2,3,4组成)
解法:因为驼峰,驼谷由三个状态组成 ,至少需要保存前两个状态。
四个状态:当前点序号 i-1 i 第几个驼峰
总结: 充分利用题目信息来Dp,不要自己想乱七八糟状态。
D - DZY Loves Sequences
题意:给你一个长n的序列,求最长连续上升子序列。允许修改一个值。
解法:第一步先求出不允许修改的递推。第二步再找出允许修改递推。
总结:先实现简单,再实现复杂一些状态。
E - Wall Bars
题意:建造一个梯子,使得人能够爬到最上面h个中的任意一个。梯子长n,有四个方向,人一步最多h长。
解法:任意选一个方向,旋转4次,从而DP。
四个状态记录的是同方向离它最近的距离。
其中一个为当前的方向,可以省略记为可达和不可达,也就是两个状态。
总结:根据题目信息来分状态。这种方向不确定的,可以任意假定一个状态,再DP。不能单纯的乘以4,因为会有重复的状态出现,还需要去重。
F - Positions in Permutations
题意:求一个1-n的全排列中,友好度恰好为k的序列有多少个。友好的定义:|A[i]-i|=1;
解法:要使一个位置友好,必须填的是i-1 或 i+1
第一步:先求出正好满足k个位置为友好的方案数。不考虑剩余的n-k个位置。(假设在位置i的数 在不填充 i-1 或 i+1时存在可以填充其他值)
状态为: 当前位置 ,k, i , i+1 然后进行DP
第二步:第一步假设前提下,F[k]=D[n][k][][] *fac(n-k) 即为大于等于k个友好的方案数。
而要求的是恰好为k个友好的方案数。最基本的想法是F[k]-F[k+1],但是这样是错的。因为这是在假定前提下实现的。假定不一定成立的。
也就说F[k]的值是大于前面所说的“大于等于k个友好的方案数”,因为多包含了一些本来应该算作是F[k+1]的方案。
如 n=2,k=1;
全排列为:1 2
2 1
F[1]=2;
F[2]=1;
但是事实F[1]=0,不满足假设的条件;
既然会有不满足的,就反其道行之直接减去所有可能不满足的即可。
设Ans[k]为恰好为k个友好的方案数,即题目所求。
因为计算时假设在位置i的数 在不填充的i-1 或 i+1时存在可以填充的其他值,
那么减去时也假设在位置i的数 在不填充的i-1 或 i+1时存在可以填充的其他值,
这样就相互抵消了。
然后继续递推就可以求解了。
总结:神一样的思路。这个看智商的……以后继续跪。
G - Sereja and Subsequences
题意:给一个长度为n 的数组。可以求所有的不同的非递减子序列。
对于每个非递减序列,求出和它长度相等,且字典序小于等于它的个数。问总共的个数。
解法:其中有个关键点是不同的非递减序列。要实现不同的非递减序列,可以先根据他们的ID[ i ]排序,这样就可以避免重复的问题。
接下来用树状数组来实现log(n)的递推。
总结:神一样的思路。碰到“不同的”子序列,可以往树状数组方向考虑一下。