随笔分类 -  状态压缩

多米诺骨牌 优化版
摘要:算法:在之前搜索出状态的基础上,再压缩一次状态。View Code //by yefeng#include<iostream>using namespace std;typedef long long LL; const int mod = 9937;int mask,idx, n , m;struct Matrix{ int mat[257][257]; void zero() { memset(mat,0,sizeof(mat)); } void unit(){ memset(mat,0,sizeof(mat)); fo... 阅读全文

posted @ 2012-08-18 16:38 more think, more gains 阅读(236) 评论(0) 推荐(0)

HDU 4332 Constructing Chimney 矩阵快速幂
摘要:算法:1.状态压缩2.搜索3.矩阵快速幂View Code #include<iostream>using namespace std;typedef long long LL;const int mod = 1000000007;const int mask = 255;struct Matrix{ LL mat[100][100]; void unit(){ memset(mat,0,sizeof(mat)); for(int i = 0; i < 100; i++) mat[i][i]=1; } void zero(){... 阅读全文

posted @ 2012-08-18 16:37 more think, more gains 阅读(197) 评论(0) 推荐(0)

POJ 2411 Mondriaan's Dream 状态压缩 搜索
摘要:题意:求用1 * 2 的矩行拼h * w的矩阵方法数(h,w <=11)算法:1.朴素算法,根据关系,枚举由于在做第i行dp时必须完全覆盖第i-1行,只要抓住这个条件不放就行。1、如果第i行中有0,则第i-1行一定为1;2、如果第i行中为1的x列第i-1行为0,说明第i行肯定是竖着放的;3、如果第i行中为1的x列第i-1行的该列也为1,可能性只有一个,第i行是横放的,所以第i行的x+1列也必须为1,又因为第i行的x+1列为1是因为横着放的,所以第i-1行的x+1列也必须为1。View Code //自己没写枚举暴力的代码了,速度很慢2000ms,代码来自//http://gisyhy.b 阅读全文

posted @ 2012-08-06 17:23 more think, more gains 阅读(185) 评论(0) 推荐(0)

HDU 3811 炮兵阵地
摘要:题意:中文题http://poj.org/problem?id=1185算法:N <= 100;M <= 10。枚举每行状态,1表示该行放炮兵,0表示不放,相邻两位不能有1,这样的状态才合法特殊处理第一行,第二行状态。int cow[110];//保存行状态信息 int num[100]; //保存状态数int sum[100]; //保存状态对应的1,即炮兵数int dp[110][64][64]; //dp方程, dp[i][j][k]表示第i行状态为j,上一行状态为k枚举后面的行。由前往后推,num[i]&num[j] == 0 num[i]&num[k] = 阅读全文

posted @ 2012-08-06 16:29 more think, more gains 阅读(268) 评论(0) 推荐(0)

POJ 1170 shopping offers 状态压缩 记忆化搜索
摘要:题意:给你n件物品,三个参数描述该物品,编号,数量(<=5),每件价格。 n <= 5然后给你s种方案,第一个数位商品种类对数,然后是该商品型号,数量,最后一个数是该方案价格。求把所有物品买完最低的价格。算法1:商品种类很少,<= 5开个五维数组int dp[5][5][5][5][5],dp[a][b][c][d][e][f],表示第1中物品买a件,第2种物品买b件,。。,第5种物品买f件所需要价格然后DFS枚举每一种方案,记忆化搜索,即可以算出最优解。View Code #include<stdio.h>#include<stdlib.h>#inc 阅读全文

posted @ 2012-08-06 15:48 more think, more gains 阅读(304) 评论(0) 推荐(0)

HDU 3811 DP状态压缩
摘要:算法:dp[state][n]表示该状态前N位不是完美排列的个数。步骤:1.初始化第 0 位值2.第i位从第i-1位推出,每一位,枚举(1<<N)种状态。3.答案就是N!- dp[(1<<N)-1][N-1]View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<m 阅读全文

posted @ 2012-08-06 14:51 more think, more gains 阅读(163) 评论(0) 推荐(0)

HDU 3811 Permutation 记忆化搜索 状态压缩 DP
摘要:题意:求1-N的排列数但是有限定条件,AI,BI,该排列要满足第AI位为Bi。算法:1.裸的DFS果断TLE。。时间复杂度为N!View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>us 阅读全文

posted @ 2012-08-05 11:25 more think, more gains 阅读(181) 评论(0) 推荐(0)

HDU 3006 The Number of set状态压缩
摘要:题意:给你N个集合,k个元素,元素值小于等于14,问由这些集合可以构造出多少新的不同集合。。。算法:由元素值特别小,可以这样处理。。1,2就是set[i]第1,2位为1然后把所有集合的合并,枚举。。最后枚举1..1<<m之间哪些数存在可以组成。。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<queue>using namespace std;int N, M, set[110];int d 阅读全文

posted @ 2012-08-05 10:06 more think, more gains 阅读(180) 评论(0) 推荐(0)

HDU 1074 Doing Homework 状态压缩 + 搜索
摘要:题意:就是有0-15个工作,每个工作有完成日期限制,还有完成这个工作所需要时间,求完成所有工作花时最少,并且输出这些顺序。。。因为工作很小,最多也就1<<15种方案,BFS枚举所有方案即可。View Code /*鐘舵€佸帇缂?+ 鎼滅储*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<algorithm>using namespace std;struct node{ char name[110]; int end 阅读全文

posted @ 2012-08-05 09:42 more think, more gains 阅读(144) 评论(0) 推荐(0)

HDU 1565 状态压缩
摘要:题意:你一个n*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。(n <= 20)算法:因为n比较少20,可以用状态压缩,1表示方格该数取,0表示不取。每一行的状态有1<<N种,先预处理所有合法状态,即相邻两位不能为1,判断条件是i && (i<<1),下一行的状态要满足条件的是跟上一行没有相邻的 num[i] & num[j] == 0int num[21000]; //状态 int sum[21][21000]; //该状态的和 阅读全文

posted @ 2012-08-05 09:13 more think, more gains 阅读(196) 评论(0) 推荐(0)

导航