状态压缩DP
芋智波佐助
菜鸟一只
展开
-
SGU 131.Hardwood floor 状态压缩DP
#include #include typedef __int64 LL;LL dp[10][1<<10];int n, m;int st, flag;void dfs(int i, int s, int ns, int j, LL num){ if(j == m) { dp[i+1][ns] += num; return; } if((s&(1<<j)) == 0)原创 2015-03-02 14:27:19 · 1060 阅读 · 0 评论 -
Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party题意:和HDU 4284 差不多 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路思路:首先预处理每两点之前的最短路 然后只考虑那些商店 个数小于15嘛 就是TSP问题 状态压缩DP搞一下 状态压缩姿势不对 有必要加强#include #include #include #include原创 2014-07-06 17:32:01 · 1035 阅读 · 0 评论 -
Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed题意:有向图 派出最少的人经过所有的城市 并且每个人不能走别人走过的地方思路:最少的的人可以走完全图 明显是最小路径覆盖问题 这里可能有环 所以要缩点 但是看样例又发现 一个强连通分量可能要拆分 n最大才15 所以就状态压缩 将全图分成一个个子状态 每个子状态缩点 求最小路径覆盖 这样就解决了一个强连通分量拆分的问题原创 2014-07-12 11:36:25 · 1525 阅读 · 0 评论 -
UVa 11825 Hackers’ Crackdown / 状态压缩DP
代码就是书上的 这题太神了 太好了直接看书吧孩子 书上讲的蛮好的2进制枚举子集还是很巧妙的a[i]表示的树中1的地方表示相连 所有1组成一个集合cover[i]表示a[i]的组合 比如i = 6 就是 110 就是a[1] a[2]2个集合的并集dp[i]表示集合i做多终止几项服务for(int s0 = s; s0; s0 = (s0-1)&s)s0 枚举了s的子集原创 2014-01-23 14:05:20 · 1121 阅读 · 0 评论 -
UVa 10911 Forming Quiz Teams / 状态压缩DP
小白书上讲的很详细n对点 两两配对 求每对点的距离之和最小状态压缩DP 经典#include #include #include #include using namespace std;const int maxn = 18;double dp[1<<maxn];double x[maxn];double y[maxn];double d(int i, int j原创 2014-03-12 11:55:54 · 1030 阅读 · 0 评论 -
HDU 4284 Travel / 状态压缩DP
最多15个必须经过的城市 2进制表示dp[i][j] 表示i这个状态下现在位置是第j个城市剩下的最大钱数我日啊 id有一个错了 害我哇了12次 #include #include #include using namespace std;const int maxn = 110;int INF = 999999999;struct Li{ int u, c, d;}b原创 2014-03-07 09:30:58 · 1000 阅读 · 0 评论 -
POJ 2923 Relocation / 状态压缩DP
和以前做的差不多n《=10 很容易忘状态压缩那里想预处理一下 哪几个物品可以一次运完 可以的话用一个二进制表示 并且dp[state] = 1 表示一次就可以然后平常那样做状态压缩DP就行了 #include #include #include #include using namespace std; const int maxn = 12;const int INF原创 2014-03-17 22:39:17 · 924 阅读 · 0 评论 -
POJ 2441 Arrange the Bulls / 状态压缩DP
还是比较简单的 入门的DP#include #include const int maxn = 22;int dp[2][1<<maxn];int pre[1<<maxn];int a[maxn][maxn];int main(){ int n, m; scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { scan原创 2014-03-27 12:11:38 · 1038 阅读 · 0 评论 -
POJ 1038 Bugs Integrated, Inc. 状态压缩DP
题目来源:1038 Bugs Integrated, Inc.题意:最多能放多少个2*3的矩形思路:状态压缩DP啊 初学 看着大牛的代码搞下来的 总算搞懂了 接下来会更轻松吧3进制代表前2行的状态(i行和i-1行)1代表i-1行占位 2代表i行占位 i-1不管有没有占位都不会影响的0代表i行和i-1行都空闲然后枚举状态dfs更新状态 话说就不能没写深搜了 有点不会了#incl原创 2014-05-30 21:29:04 · 1472 阅读 · 0 评论 -
Light OJ 1011 Marriage Ceremonies 状态压缩DP
题目来源:Light OJ 1011 Marriage Ceremonies题意:n个男生和n个女生配对 给出n*n的矩阵 aij表示男生i选择女生j得到的值 求两两配对后最大可能得到的值思路:dp[i][s|(1#include #include #include using namespace std;const int maxn = 17;const int INF =原创 2014-06-03 15:46:23 · 1280 阅读 · 0 评论 -
UVa 11008 Antimatter Ray Clearcutting / 状态压缩DP
一看题目就知道是状态压缩 DP然后n棵树至少要砍掉m棵每次可以去掉一整行的树 斜着也可以 求最少的次数开始不知道怎么存一整行 百度了 然后是用一个二维数组a[i][j] 里面一个二进制 表示可以朝i j这个发现去掉的树然后i == j的时候我是 a[i][j] = 1网上大多数是记忆化搜索 递推也行还需好好消化#include #include #include原创 2014-03-13 12:51:00 · 1222 阅读 · 0 评论 -
HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
状态压缩dp+spfa解斯坦纳树枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 其中k和l是对j的一个划分按照边进行松弛 dp[i][j] = min(dp[i][j], dp[i'][j]+w[i][j])其中i和i'之间有边相连#include #include #include using name原创 2014-10-17 11:14:07 · 1238 阅读 · 0 评论