状态压缩
煦--晨
菜鸟起飞
展开
-
hdu(1074)Doing Homework
#include"stdio.h"#include"string.h"#include"stdlib.h"#define inf 0x7fffffffint hash[60000],used[1000];int save[1000],temp[1000];int m,n,ans;struct point{ int name[200]; int x,y;}原创 2013-08-13 22:55:40 · 508 阅读 · 0 评论 -
hdu(4539)排兵布阵
和炮兵阵地差不多,要注意几个条件即可。。 题意:n行m列的矩阵,1表示可以放东西,0表示不可以。曼哈顿距离为2的两个位置最多只能有一个位置放东西。问最多放多少个东西。 对于某一行的状态可以由前面的两行推出。即:dp[ i ][ j ][ k ] = max( dp[ i ][ j ][ k ] , dp[ i-1 ][ k ] [ k2 ] + ones[ j ]原创 2013-08-17 11:29:38 · 837 阅读 · 0 评论 -
(poj)3254 Corn Fields
和炮兵阵地差不多。。/*【题目大意】类似于上面一道题,一个方格组成的矩阵,每个方格可以放大炮用0表示, 不可以放大炮用1表示(原题用字母),让放最多的大炮,大炮与大炮间不会互相攻击。【题目大意】一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(原创 2013-08-17 09:59:26 · 504 阅读 · 0 评论 -
poj(1185)炮兵阵地
思路:状态压缩DP。很经典的状态压缩DP。用int型来表示每行的状态(如果int型的二进制的第i位为1,则表示这一行的第i列有安装大炮)。这样的话由于最多有10列,故由计算可得最多有60种状态。DP部分:dp[r][i][k]表示第r行的状态为k,第r-1行的状态为i时候,前r行最多能够安装的大炮数量。 #include#includeint dp[105][100][100];/原创 2013-08-16 20:00:39 · 544 阅读 · 0 评论 -
状态压缩动态规划
动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。 *:一般有个数据 n *:确定了为状态DP,那么第一步就是预处理,求出每行所有可能的状态了,cnt记录总的状态数,stk[]记录所有的可能状态。以炮兵阵地为例: int cnt, stk[MA原创 2013-08-17 08:30:31 · 610 阅读 · 0 评论 -
hdu(2167)Pebbles
#include"stdio.h"#include"string.h"int dp[3][1int max(int a,int b){ a=a>b?a:b; return a;}int main(){ int len,m,i,j,k,q,sum,ss,p; char a[1000]; int b[100][100],s[1000]; while(原创 2013-08-16 16:51:05 · 532 阅读 · 0 评论 -
hdu(1569)方格取数(2)(dinic算法)
ek算法效率太低,在这会超时,用dinic算法,还不错。。#include"stdio.h"#include"string.h"#define inf 0x7fffffff#define M 20000int n,m,s,t,adj[M],dis[M];int q[M],p[M],sum;struct point { int v,u; int flow,原创 2013-08-16 10:25:55 · 534 阅读 · 0 评论 -
hdu(1429) 胜利大逃亡(续) 队列+bfs+状态压缩
/*本题用到状态压缩,这个还真没想到,想到了也不会。。得好好学学状态压缩了;本题要采用|运算来模拟拾取钥匙点;(用用&来判断是否能打开该门; (>>右移&1来判断);100表示有第3把,111表示有第3,2,1把钥匙,如果该点为钥匙点,则可采用|运算来模拟拾取,显然0001|1000 = 1001,同理,当为相应的门时采用&运算来模拟开启,例如1101 & 0原创 2013-08-26 19:00:08 · 574 阅读 · 0 评论 -
hdu(4628)Pieces
题意:给定一个串,每次可以删除一个回文子串,问把全串删干净的最少次数。思路:用状态压缩把所有的状态枚举出来,用数组记录所表示状态所有字符被删除干净的最少次数如果是回文串则dp为一,不然则为无穷大;用fun来处理是否为回文串,然后就用dp即、解决了,。。。#include"stdio.h"#include"string.h"int dp[1char a[22],s原创 2013-08-13 13:32:19 · 536 阅读 · 0 评论 -
hdu(1565)方格取数(1)
利用最大流求权值。。对于此棋盘应进行黑白染色,相邻元素其权值为无穷大,源点到白棋的权值为白棋的值,黑棋到汇点的权值为黑棋的值。然后建立通路求出最大流。。。#include"stdio.h"#include"string.h"#include"queue"#define inf 0x7fffffffusing namespace std;int r[300][30原创 2013-08-13 16:48:22 · 644 阅读 · 0 评论