【POJ3254】Corn Fields
http://poj.org/problem?id=3254
题意:给你一块n*m(0<n,m<=12)的地图,其中有的方格是肥沃的(用1表示),有的方格是贫瘠的(用0表示)。现在约翰要在肥沃的土地上放奶牛,且要求不能有两个奶牛相邻,请问有多少种方案数。
状压DP入门题。
首先预处理每一行不考虑贫瘠地时所有可行的放置状态,用states数组存着。
然后令f(i,j)为考虑前i行且第i行放置状态为states[j]时的方案数,可得f(i, j)=sigma{f(i-1, k) | states[j]&states[k]==0} (states[j]不包含第j行的贫瘠地),f(i, j)=0(states[j]包含第j行的贫瘠地)。
先计算第一行的方案数,再递推第二行到第n行的方案数,最后答案为sigma{f(n,j)}。具体实现看代码
#include <iostream>
#include <vector>
using namespace std;
template <class T>
void update(T &x)
{
while (x >= )
x -= ;
}
int r, c, map[]; // 初始地图
int states[ << ], siz = ; // 不考虑贫瘠地时每一行的所有可行放置方案
int dp[][ << ]; // dp[i][j]表示考虑前i行且第i行放置状态为states[j]时的方案数
int main()
{
ios::sync_with_stdio(false);
cin >> r >> c;
for (int i = ; i < << c; i++)
if (!(i & (i << ))) // 若状态i不存在两个相邻的1
states[++siz] = i; int a;
for (int i = ; i <= r; i++)
{
for (int j = ; j < c; j++)
{
cin >> a;
if (!a)
map[i] |= ( << j);
}
} for (int i = ; i <= siz; i++)
if (!(states[i] & map[])) // 若状态states[i]不包含第一行的贫瘠地,则出现一种放置方案
dp[][i] = ; for (int i = ; i <= r; i++)
{
for (int j = ; j <= siz; j++) // 枚举这一行的放置方案
{
if (states[j] & map[i]) // 若状态states[j]包含第i行的贫瘠地
continue;
for (int k = ; k <= siz; k++) // 枚举上一行的放置方案
{
if (states[k] & states[j]) // 若状态states[k]与状态states[j]有相同位置的1
continue;
update(dp[i][j] += dp[i - ][k]);
}
}
} int ans = ;
for (int i = ; i <= siz; i++)
update(ans += dp[r][i]);
cout << ans;
return ;
}
【POJ3254】Corn Fields的更多相关文章
- 【poj3254】Corn Fields 状态压缩dp
AC通道:http://vjudge.net/problem/POJ-3254 [题目大意] 农夫约翰购买了一处肥沃的矩形牧场,分成M*N(1<=M<=12; 1<=N<=12 ...
- 【POJ3254】Corn Fields 状压DP第一次
!!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...
- 【poj3254】 Corn Fields
http://poj.org/problem?id=3254 (题目链接) 题意 给出一块n*m的田地,有些能够耕种,有些不能.要求将牛两两不相邻的放在田中,牛的个数至少为1个.问有多少种放法. So ...
- 【POJ3254】Corn Fields(状压DP)
题意: 一个M x N矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案( ...
- POJ3254:Corn Fields(状压dp第一发)
题目:http://poj.org/problem?id=3254 直接上代码吧,刚开始做时主要的问题就是看不懂二进制,有个博客写的太好了,就直接把题解复制在下面了. #include <ios ...
- 【USACO 2006 November Gold】Corn Fields
[题目链接] 点击打开链接 [算法] 状压DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 12 #def ...
- 【poj2226】 Muddy Fields
http://poj.org/problem?id=2226 (题目链接) 题意 给出一个只包含‘.’和‘*’的矩阵,用任意长度的宽为1的木板覆盖所有的‘*’而不覆盖‘.’,木板必须跟矩形的长或宽平行 ...
- 【POJ2226】Muddy Fields
题目大意:给定一个 N*M 的图,图中有一些格子不能被任何东西覆盖,现有一些宽度为 1,长度任意的骨牌覆盖这些可以被覆盖的格子,骨牌之间可以重叠,求将所有可以被覆盖的格子覆盖所需的最小骨牌数是多少. ...
- POJ3254:Corn Fields——题解
http://poj.org/problem?id=3254 题面来自洛谷:https://www.luogu.org/problemnew/show/1879 农场主John新买了一块长方形的新牧场 ...
随机推荐
- linux环境下安装redis扩展
注意:目录的权限 chomd 777 -R 1.安装redis 下载:https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz 上传ph ...
- tomcat默认日志路径更改
在项目访问量不断增加时,tomcat下logs也迅速增大,有时甚至因为填满了所在分区而出现无空间写入日志而导致程序出问题. 这时要更改logs的默认目录,指向更大的磁盘.修改主要有两步: 1. 修改t ...
- Problem M
Problem Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost ...
- mysql别名的使用
在项目中遇到别名的问题,抽时间整理了一下 在sql中,合理的使用别名可以让sql更容易写并且提高可读性.别名使用 as 来表示,可以分为表别名和列别名. 别名应该是先定义后使用才对,所以首先要了解sq ...
- Object.observe() 观察对象
这个对象方法可以用来异步观察对javascript对象的改动: // Let's say we have a model with data var model = {}; // Which we ...
- 开发一个基于 Android系统车载智能APP
很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...
- CodeForces - 706B 二分stl
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...
- NOIP2017衢二中旅游记Day 1
NOIP前一天下午早早的去了衢州: 车程大概在4个半小时左右: 车上大家都一脸颓废,并混杂着动听的音乐: 到了衢州二中,立刻跑去吃晚饭: 吃饭的队伍特别长,吃面的却空无一人: 我毅然决然地选择了去吃面 ...
- ldap数据库--ODSEE--ACI
查看跟DN下的aci ldapsearch -h hostname -p port -D "cn=Directory Manager" -w - -b "BASE_DN& ...
- SUID,SGID,SBIT这些到底是什么
SUID,SGID,SBIT这些都是文件的特殊权限. SUID(Set UID)文件执行过程中,用户拥有文件的root权限. SGID(Set GID)文件执行过程中,执行者拥有该文件的用户组的权限. ...