您的位置:首页 > 其它

dp专题训练

2015-11-16 10:40 239 查看
说最近模拟赛的状态不太好噢,总是犯一些从未出现过的奇奇怪怪的错误。还是自己太弱了。bzoj 3743 kmap这道题首先找出来虚树,算出虚树的边的总长。这样虚树内的点的答案就是总长*2-虚树中距它最远点的距离。然后距它最远点的距离是直径上的点。虚树外的点就是找到距它最近的虚树内的点的答案加上这个距离。开始的时候我按照奶牛集会的那道题写了。
bzoj 2669 局部极小值有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值。
给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵。

有一个和dp求n的排列中有k个逆序对的方案数一样的转化
从小到大放数,那么如果一个是局部极小值的格子没有被放数,那么周围都不能放数。由于最多有8个位置是局部极小值,所以可以状压哪些格子放了。
令cnt[S]表示当前状态已经被放了局部极小值的格子的总数和不是局部极小值的格子中可以放的格子的总和。f[S][i]表示状态为S,放了前i个数的方案数。那么f[S][i]=sigma(f[S^j][i-1](j&S>0))+[cnt[S]-(i-1)]*f[S][i-1]
然后会有一些不是局部极小值的位置出现了局部最小值,容斥掉就行了

bzoj1049 数字序列
将一个随机数列变成单调上升需要改变的最少的数,和满足改变的数最少的情况下每个数改变的绝对值之和最小。
首先将最长上升子序列转化为不下降,做出第一问。由于是随机数据,感觉可以转移到每个数的数个数不会太多,所以暴力就行了然后有一个性质,如果从j转移到i的话,那么中间一定有一个k(k>=j&&k<i),使得j~k的高度都是a[j],k+1~i的高度都是i,且这样的花费是最优的。表示不会证,但感觉是对的。开始wa了好几发,问题分别是(1)dp[i]维护的是所有数都变成小于等于i的值的答案,而最优解不一定是这样。用到了一个很常用的东西,找一个超级终点作为转移的末端(2)没有考虑好a[i]是负数的情况。
bzoj 2734 集合选数如果x在集合中,2x,3x都不在集合中,求满足条件的方案数
构造矩阵
1 3 9 27…2 6 18 54…4 12 36 108………每个数是上面的数乘2,左面的数乘3。这样进行状压dp就是相邻的格子不能选的方案数。如何判断一个二进制数没有两个连续的1? x&(x<<1)=0如果有的数没有出现过,就以它为左上角元素再构造一个矩阵。这是怎么想到的?!!bzoj 3594 方伯伯的玉米田开始觉得自己好不容易想出一道题,后来发现自己是错的。用f[i][j]表示前i个玉米,发动j次技能最多能留下的玉米数。但是这个东西可以由j=1~i-1中任意一个数转移来,所以用树状数组优化dpf[i][j]=f[p][q]+1(p<i&&i+j>=p+q&&q<=j)注意要从大往小枚举
还有一些自己以前做过的题:bzoj 1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法bzoj 2064 分裂有一种方法肯定是可以的,把以前的全部合并,再一个个分裂成现在的。那么最少的方案怎么来呢?如果以前的一部分可以单独对应(单独地合并分裂)到现在的一部分,就没必要把他们和剩下的再合到一起再分开了。这个过程用dp解决。为了方便,另以前的面积为正,现在的面积为负,于是就是要尽量的凑零。于是我们要知道所有的选择的和。这个用状压解决,另sum[S]表示把S对应的集合(转为二进制)的面积之和。sum可以递推,用S&-S求出最小元素t,然后sum[S]=sum[t]+sum[S-t],常用技巧get。f[S]表示S这个集合处理过程中最多能得到0的次数。最优子结构,枚举每一个i∈S,f[S]=max(f[S^i])。如果sum[S]=0,f[S]++。最后答案就是n+m-2*f[Smax]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: