题意:给一个n*m的地图,地图只有1和0组成,0代表不可以放牧,1代表可以放牧;不能有相邻的牛,问有多少种放牧方法。
经典状态压缩 用数组map作为地图用2进制来表示0代表不可以放牧,1代表可以放牧;通过x&x
通过x&y来判断在上一行满足题意的情况在当前行能否满足题意。个人认为状态压缩DP 刚开始蛮不好学的,但是愈战愈勇才是一个ACMer该有的品质!...
分类:
其他好文 时间:
2015-01-20 18:07:33
阅读次数:
180
Description
During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring comes, Holedox wakes up, moves to the exit of its lair, comes out, and begins its new life.
Holedo...
分类:
其他好文 时间:
2015-01-20 10:29:05
阅读次数:
193
状态压缩。分最后一个槽的值以及当前的配置方案是否可以进行DP。 1 /* 1438 */ 2 #include 3 #include 4 #include 5 6 #define MAXN 32 7 8 const int MAXS = 1= 3)52 an...
分类:
其他好文 时间:
2015-01-16 16:04:00
阅读次数:
158
题目地址:POJ 1185
这题的一个判断条件写错了。。导致错了好多遍。。sad。。
这题跟3254差不多。
可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的...
分类:
其他好文 时间:
2015-01-10 15:14:46
阅读次数:
181
题目大意 用1*3的骨牌覆盖一个n*m的矩阵,求方案数。分析 m大小为9,状态压缩dp的标志,1*3的骨牌与上两层有关,故可以用2^18来表示状态,横放或者竖放,算一下时间复杂度 30*9*2^18=300000000,而题目只给了2s,晕,故这个题就是卡这种方法,于是就需要转换一下方法了,还是.....
分类:
其他好文 时间:
2015-01-02 19:53:51
阅读次数:
124
最开始的想法是搜索,发现不对,后来发现数据量很小,可以状态压缩+DP。 1 /* 4628 */ 2 #include 3 #include 4 #include 5 6 #define MAXN 17 7 #define INF 9999 8 9 char s[MAXN];10 ...
分类:
其他好文 时间:
2015-01-02 17:25:54
阅读次数:
130
题解:
首先考虑dfs,但是看到答案的“64bit”就放弃了吧、
所以肯定是组合数、状压DP什么的,尤其是那个16,标准的状压数。
好吧,就是状压DP。
f[i][j]表示i是状压的01串表示哪个取了哪个没取,然后j是结尾字符,
虽然水,但是时间复杂度是可以过的。
代码:
#include
#include
#include
#include
#include...
分类:
其他好文 时间:
2015-01-02 12:17:27
阅读次数:
148
数位dp核心在于状态描述,因为阶段很简单。
一般都是求有多少个数,当然也有求平方的变态题。
因为比这个数小的范围定然是从左至右开始小的,那么什么样的前缀对后面子数有相同的结果?
HDU 3652
题意:求能被13整除且含有13这样数的个数。
赤裸裸的两个条件,加上个pre标明下前缀,其实直接开状态也是一样的。整除这个条件可以用余数来表示。余数转移:(mod*10+i)%13
/* **...
分类:
其他好文 时间:
2014-12-28 11:45:41
阅读次数:
229
这道题很容易想到状压dp,首先跑一遍floyd求出各个点之间的最短路,然后dp。
状态是dp[i][j]表示状态为i(二进制,表示是否访问过每个点),在位置j时的最短路。
转移就是:dp[i][j]=min(dp[i-(1<<v)][u]+grid[u][v],dp[i][j]),其中v是当前位置,u是上一个状态的位置。
需要注意的是dp的顺序应该是由含1的个数少的二进制到1的个数高的二进制;由于最开始就在0位置,所以dp[(1<<n)-1][0]不可能被转移到,所以最后的答案应该是ans=min(ans,...
分类:
其他好文 时间:
2014-12-26 20:22:01
阅读次数:
260