状态压缩DP
POJ 2441: Arrange the Bulls
表示前i头cow,目前畜栏使用情况为j的方案数。
初值:
转移方程:
目标:
ps:注意需要使用滚动数组防止MLE,加入剪枝(如果目前状态方案数为0则不转移)防止TLE,加入清空滚动数组的操作防止WA。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
d[i,j]表示前i头cow,目前畜栏使用情况为j的方案数。
初值:d[0,0]=1
转移方程:d[i,j|(1<
#include
#include
#include
#include
#include
POJ 3254: Corn Fields
预处理出use数组表示可行的二进制数集合。
表示前i行,第i行状态为j的方案数。在保证第i行和第i-1行状态不矛盾 且和土地使用条件不矛盾 的情况下转移即可。
代码如下
/*
预处理出use数组表示可行的二进制数集合。
d[i,j]表示前i行,第i行状态为j的方案数。在保证第i行和第i-1行状态不矛盾 且和土地使用条件不矛盾 的情况下转移即可。
*/
#include
#include
#include
#include
#include
#include
POJ 2836: Rectangular Covering
任意两个点可以确定一个矩形。(分别作为左下角和右上角)于是预处理出所有这样n*n个矩形的覆盖点集和面积进行状态压缩dp。
表示目前覆盖状态为i的最小面积和。(注意重合的面积,重合几次就计算几次)
初值:,其他为INF
目标:
转移方程:
其中
表示i点和j点分别作为左下角和右上角构成的矩形能够覆盖的点集。
表示i点和j点分别作为左下角和右上角构成的矩形的面积。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
任意两个点可以确定一个矩形。(分别作为左下角和右上角)于是预处理出所有这样n*n个矩形的覆盖点集和面积进行状态压缩dp。
d[i]表示目前覆盖状态为i的最小面积和。(注意重合的面积,重合几次就计算几次)
初值:d[0]=0,其他为INF
目标:d[(1<
#include
#include
#include
#include
#include
POJ 1795: DNA Laboratory
题解链接:https://blog.csdn.net/qq_29169749/article/details/54755026
PS:注意dp中的顺序问题,详见注释。
代码如下
/*
题解链接:https://blog.csdn.net/qq_29169749/article/details/54755026
PS:注意dp中的顺序问题,详见注释。
*/
#include
#include
#include
#include
#include
#include
POJ 3411: Paid Roads
dijkstra即可。
注意由于有些点可能会反复经过,所以第一维枚举难以有固定顺序,不能用循环来进行状态压缩dp。
代码如下
/*
dijkstra即可。
注意由于有些点可能会反复经过,所以第一维枚举难以有固定顺序,不能用循环来进行状态压缩dp。
*/
#include
#include
#include
#include
#include
#include
矩阵的幂
POJ 3420: Quad Tiling
找规律发现:f(n)=f(n-1)+4f(n-2)+2f(n-3)+3f(n-4)+2f(n-5)+3f(n-6)+...
f(n)-f(n-2)=f(n-1)+4f(n-2)+f(n-3)-f(n-4)
即f(n)=f(n-1)+5f(n-2)+f(n-3)-f(n-4)
最后用矩阵优化递推即可。
注意找递推规律时,注意不重不漏的原则,不能让矩形可以从中分割出来成为两个独立的小部分。
ps:一个天坑在于,这个递推公式递推时,直接取模可能算出负数,所以要处理一下。
代码如下
/*
找规律发现:f(n)=f(n-1)+4f(n-2)+2f(n-3)+3f(n-4)+2f(n-5)+3f(n-6)+...
f(n)-f(n-2)=f(n-1)+4f(n-2)+f(n-3)-f(n-4)
即f(n)=f(n-1)+5f(n-2)+f(n-3)-f(n-4)
最后用矩阵优化递推即可。
注意找递推规律时,注意不重不漏的原则,不能让矩形可以从中分割出来成为两个独立的小部分。
ps:一个天坑在于,这个递推公式递推时,直接取模可能算出负数,所以要处理一下。
*/
#include
#include
#include
#include
#include
#include
POJ 3735: Training little cats
题解链接:https://blog.csdn.net/wangjian8006/article/details/7884989
代码如下
/*
题解链接:https://blog.csdn.net/wangjian8006/article/details/7884989
*/
#include
#include
#include
#include
#include
#include
数据结构与DP
POJ 3171: Cleaning Shifts
算法竞赛进阶指南上的题目,也是挑战程序设计竞赛上面的题目。
表示覆盖的最小代价。
先按照右端点升序排序,顺序考虑每个区间。
初值:,其余为INF
目标:,其中
转移方程:,其中
ps:按照左端点升序排序来做也可行,目前原因未知。
代码如下
/*
算法竞赛进阶指南上的题目,也是挑战程序设计竞赛上面的题目。
d[i]表示覆盖[M,i]的最小代价。
先按照右端点升序排序,顺序考虑每个区间。
初值:d[m-1]=0,其余为INF
目标:max{d[x]},其中x>=b_{i}
转移方程:d[b_{i}]=min{d[x]}+S_{i},其中a_{i}-1<=x<=b_{i}
ps:按照左端点升序排序来做也可行,目前原因未知。
*/
#include
#include
#include
#include
#include
#include