poj2411:http://poj.org/problem?id=2411题意:给你1*2的方块,让你把n*m的房间填好有多少种方式。题解:状压dp。这一题,我是不会做了,看懂了题解之后,震惊了。这Dp只要找对状态方程,简直就是一种艺术啊。我深深的喜欢上DP了。好了。讲讲这一题吧。首先是状态方程f...
分类:
其他好文 时间:
2014-07-29 11:19:46
阅读次数:
238
poj1185:http://poj.org/problem?id=1185题意:这道题太经典了,看到题目就知道题意,故题意略。题解:经典的状压dp。以前觉得dp是个很难的东西,做了这一题之后发现,dp其实根本不难,真的,而且很好打。思维过程:拿到题之后,由于之前做过,所以知道是状压dp。接着想怎么...
分类:
其他好文 时间:
2014-07-29 10:43:36
阅读次数:
277
状态压缩是一个很广的概念,在OI中也有很多的应用,当我们把他应用到动态规划中,可以用来精简状态,节约空间,也方便转移。最常见的就是用二进制来表是状态,利用各种位移运算,就可以实现\(O(1)\)的转移。状压DP适用于“窄棋盘”上的DP,否则状态太多无法存下。POJ1185炮兵阵地题意:给一个\(N ...
分类:
其他好文 时间:
2014-07-27 23:17:19
阅读次数:
391
链接:http://poj.org/problem?id=3420
题意:给一个4*N(1 ≤ N ≤ 1e9)的矩形空间,并且给不限块数的1*2的多米诺骨牌,问是由多少种方式能把这个矩形空间填满。
思路:看到这种问题果断想到状压,虽然是在看矩阵的时候看到的这道题。dp[i][j]表示在第i行状态为j的情况下的填满方式数,j的二进制表示中0表示对应位置上一行的骨牌是竖放,或者对应位置的骨牌是横...
分类:
其他好文 时间:
2014-07-27 11:40:15
阅读次数:
269
状态压缩DP
dp[i][j]表示在i状态(用二进制表示城市有没有经过)时最后到达j城市的最小时间
转移方程dp[i][j]=min(dp[i][k]+d[k][j],dp[i][j])
d[k][j]是k城市到j城市的最短距离 要先用flody处理
#include
using namespace std;
int d[20][20],dp[1<<11][20];
int n,m;...
分类:
其他好文 时间:
2014-07-27 11:17:42
阅读次数:
176
集合上的dp,看小紫书想了好久~
有n个物体,m个特征,最少询问多少次能保证猜到是哪个问题。
首先在读入的时候将每个物体转化为一个二进制整数,用一个集合s来表示已经询问了哪些特征。
用d(s,a)来表示询问了集合s的特征,有集合a个特征已经具备,还需要问多少个特征的最小值。a一定为s的子集。
则状态方程为 d(s,a) = min{ max(d(s+{k},a+{k}),(s+{k},a...
分类:
其他好文 时间:
2014-07-21 23:33:05
阅读次数:
244
链接:http://poj.org/problem?id=1185
题意:一个地图上有两种地形,H和P,P上可以放一个炮,攻击范围是上下左右各两格,问的是最多可以再地图上放多少个炮。行N
思路:因为上下左右各两格内不能放置炮,所以每一行的状态数从2^10减少到60种。状态转移方程为:dp[i][j][k]=max(dp[i-1][k][l]+bb[j])。dp[i][j][k]表示在第i行状...
分类:
其他好文 时间:
2014-07-21 16:21:13
阅读次数:
272
链接:http://poj.org/problem?id=3254
题意:一块M*N的田地,每小块地大小是1*1,可以种植物的标记为1,不可以种植物的标记为0,并且相邻的两块地不可以同时种植物。问题是有多少种不同的种植方案(所有地都不种也是一种种植方案)
思路:这是第一道状压DP题,从第一行更新到最后一行,每一行用一个N位的二进制数来表示该行的状态1表示该位置种了植物,0表示该位置没种植物。因...
分类:
其他好文 时间:
2014-07-19 23:46:58
阅读次数:
387
#include #include using namespace std;#define mod 100000000int M,N,top=0;int cur[20],dp[20][600];int state[600],num[110];bool ok(int x){ if(x&x<<1)...
分类:
其他好文 时间:
2014-07-16 18:57:07
阅读次数:
229
用dfs,累加答案,或者什么的。他可能还会有一些限制,加点判断就好。sgu 131#include using namespace std;#define LL long long int n, m, i;LL f[10][512]; void dfs(int j, int opt1, int op...
分类:
其他好文 时间:
2014-07-16 18:55:55
阅读次数:
186