poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k];
这个方程得前提条件是num[i][j]&num[i-1][k]==0,也就是他们表示的二进制形式相与为0,那么就不存在相邻为1的情况。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Maxn 13
#define inf 0x7fffffff
using namespace std;
__int64 dp[Maxn][<<Maxn];
int num[][<<Maxn],cnt1,cnt2,graphic[Maxn][Maxn],co,n,m;
void dfs(int u,int j)
{
int i;
if(j==m)
{
int sum=;
for(i=m;i>=;i--)
sum+=graphic[u][i]*(<<(m-i));
if(graphic[u][j]==)
{
if(graphic[u][j-]==)
{ num[u][++cnt2]=sum;
num[u][++cnt2]=sum-;
}
else
{
num[u][++cnt2]=sum-;
}
}
else
num[u][++cnt2]=sum;
return ;
}
if(graphic[u][j]==)
{
if(graphic[u][j-]==)
{
dfs(u,j+);
graphic[u][j]=;
dfs(u,j+);
graphic[u][j]=;
}
else
{
graphic[u][j]=;
dfs(u,j+);
graphic[u][j]=;
}
}
else
dfs(u,j+);
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&graphic[i][j]);
for(i=;i<=n;i++)
graphic[i][]=;
cnt2=;
dfs(,);
for(i=;i<=cnt2;i++)
dp[][i]=;
for(i=;i<=n;i++)
{
cnt1=cnt2;cnt2=;
dfs(i,);
for(j=;j<=cnt2;j++)
{
for(k=;k<=cnt1;k++)
{
if(!(num[i-][k]&num[i][j]))
dp[i][j]+=dp[i-][k],dp[i][j]%=;
}
}
}
__int64 ans=;
for(i=;i<=cnt2;i++)
ans+=dp[n][i];
printf("%I64d\n",ans%);
}
return ;
}
poj 3254 状态压缩DP的更多相关文章
- POJ 3254 状态压缩 DP
B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB ...
- poj 3254(状态压缩+动态规划)
http://poj.org/problem?id=3254 题意:有一个n*m的农场(01矩阵),其中1表示种了草可以放牛,0表示没种草不能放牛,并且如果某个地方放了牛,它的上下左右四个方向都不能放 ...
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- POJ 1185 状态压缩DP 炮兵阵地
题目直达车: POJ 1185 炮兵阵地 分析: 列( <=10 )的数据比较小, 一般会想到状压DP. Ⅰ.如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举). Ⅱ.用DFS ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- poj 2688 状态压缩dp解tsp
题意: 裸的tsp. 分析: 用bfs求出随意两点之间的距离后能够暴搜也能够用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发訪问过s集合中的点.眼下在点u走过 ...
- Mondriaan's Dream(POJ 2411状态压缩dp)
题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...
- poj 2411 状态压缩dp
思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...
- poj 3254 状态压缩
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15285 Accepted: 8033 Desc ...
随机推荐
- jstat用法
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具.它可以显示本地或者远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据 ...
- Flask框架获取用户IP地址的方法
本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...
- CCS 5 XDS100 仿真连接错误Error connecting to the target【瓦特芯笔记】
问题现象:在点击仿真是出现连接错误: Error connecting to the target: (Error -151 @ 0x0) One of the FTDI driver funct ...
- 做XH2.54杜邦线材料-导线
好多市场上买的杜邦线质量一般,今天选了一种别的线 线色:红 黑 黄 绿 白 棕 蓝 线规:正标UL1007-24AWG 产品说明: * UL1007电子连接线 * 线号:24 ...
- POJ 3177 Redundant Paths(强连通分量)
题目链接:http://poj.org/problem?id=3177 题目大意是一个无向图给你n个点m条边,让你求出最少加多少条边 可以让任意两个点相通两条及以上的路线(每条路线点可以重复,但是每条 ...
- django控制admin的model显示列表
class goods(models.Model): name = models.CharField(max_length=300) price = models.IntegerField ...
- Realsense 人脸识别
一.代码声明 下面的代码是博主参考了Intel realsense官方SDK和官方例程后写的一段较为简单的代码,实现了简单的多人脸实时检测及跟踪功能.官方的人脸检测例程功能较多,但代码量很大,阅读起来 ...
- 使用Unity制作游戏关卡的教程(一)
转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...
- Excel设置数据有效性实现单元格下拉菜单的3种方法(转)
http://blog.csdn.net/cdefu/article/details/4129136 一.直接输入: 1.选择要设置的单元格,譬如A1单元格: 2.选择菜单栏的“数据”→“有效性”→出 ...
- PS-常用操作
快捷键 设置图片的大小:ctrl+t 放大缩小:ctrl+空格+“+or-”