POJ 3254 压缩状态DP】的更多相关文章

题意:一个矩形网格,可以填0或1, 但有些位置什么数都不能填,要求相邻两个不同时为1,有多少种填法.矩形大小最大 12*12. 压缩状态DP大多有一个可行的state的范围,先求出这个state范围,对接下来的解题非常有帮助! 注意特判 N==1 的情况. #include <iostream> #include <cmath> #include <cstring> #include <vector> using namespace std; vector&…
这个题目非常赞! 给定一个矩形,要求用1*2 的格子进行覆盖,有多少种覆盖方法呢? dp[i][j] 当状态为j,且第i行已经完全铺满的情况下的种类数有多少种?j中1表示占了,0表示没有被占. 很显然,当每行被放了之后,有一些状态是不可能的,我们这里用1 表示竖着放,0表示横着放. 所以两个0 要相邻,这是程序中的s. 我们每一状态转移,枚举每一个可能的状态,我们希望dp[i][j] 中的j呈现出s[k] 的状态,依次来进行状态转移. #include <iostream> #include…
poj  3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) 解析:根据题意,把每一行的状态用二进制的数表示,0代表不在这块放牛,1表示在这一块放牛.首先很容易看到,每一行的状态要符合牧场的硬件条件,即牛必须放在能放牧的方格上.这样就能排除一些状态.另外,牛与牛之间不能相邻,这样就要求每一行中不能存在两个相邻…
1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相邻,求有多少种放法. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #d…
这个问题要看状态怎么想,第一种直接的想法是1代表未合并,状态就从1111111 转移到 带有1个0,然后带有两个0, 但是这样子编程非常不直观.换一种思路,0代表未合并,但是我可以先合并前几个,就是说在压缩状态的过程中,状态转移的时候尽量是一个连续量的转化 #include <iostream> #include <cmath> #include <cstring> using namespace std; int cost[11][11]; int dp[1<&…
题意:略. 思路:第一次做状态压缩的dp. 在这里说一下状态压缩的原则.因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量从0枚举到2^12 - 1.对于每一个数,将其转换成二进制,先判断格子为0时该数二进制对应位上是不是1,若是则该状态不可行.其次再判断该数相邻的两位有没有同时为1的情况,如果有,该状态也不可行. 递推公式就是:dp[i][k] = dp[j][k-1]. 其中dp[i][k]表示在牧场第k行状态为i…
思路:状态压缩dp,用二进制位的1表示放了,0表示没有放.设dp[i][j],表示第i行状态为j时,前i行的方案数,状态转移方程就是 dp[i][j] += dp[i-1][k],j与k这两个状态不冲突.最后答案就是dp[n][1...top] 之和. #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using n…
题意: 给一块n*m的田地,1代表肥沃,0代表贫瘠. 现在要求在肥沃的土地上种草,要求任何两个草都不能相邻. 问一共有多少种种草的方法. 种0棵草也是其中的一种方法. n和m都不大于12. 思路: 状态压缩DP,dp[i][j]代表在第i行状态j一共有多少种可能的种植方法. j是二进制转化而来的状态,0代表不种草,1代表种草. dp[i]只受到两个限制,即dp[i-1]的某种状态,和当前土地的贫瘠状况. 只要保证&操作之后重复的为0就可以了 最后输出sum(dp[n][1...w])(w代表一共…
题意:就是你给一个n行m列的矩阵,矩阵里的元素由0和1组成,1代表肥沃的土地可以种植作物,0则不可以种植作物,并且相邻的土地不能同时种植作物,问你有多少种种植方案. 分析:这是我做的第一道状态压缩dp的题,总的来说还是很容易理解的,直接上代码! 代码实现: #include<stdio.h> #include<string.h> #include<math.h> #define mod 100000000 int n,m,a[15]; int dp[13][(1<…
题目大意:有一个M*N的牧场,G(i, j) = 1表示这块地营养丰富,可以喂养牛,等于0表示贫瘠,不能喂养牛,所有的牛都讨厌与别的牛相邻,求有多少种放置牛的方式. 分析:算是炮兵那个题的弱化版吧,先求出来所有的合法状态(不到500种),然后与上一行的状态匹配即可. 代码如下: ==============================================================================================================…