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 ;
}

最新文章

  1. codeforces 360 C - NP-Hard Problem
  2. 转: 使用virtualenv搭建独立的Python环境
  3. MusigCV安装
  4. mysql去掉字段字符中间空格
  5. node js npm 和 cnpm的使用
  6. 2 _RESETFUL介绍
  7. php_Symfony_项目实战全过程记录
  8. 3.struts2访问Servlet API,并和mybaits实现全套增删改查
  9. 阿里舆情︱舆情热词分析架构简述(Demo学习)
  10. selenium 爬虫
  11. java学习之静态内部类
  12. 转 Postman访问Webapi的Get/Post/Put/Delte请求
  13. 再也不用担心面试官问你HashCode和equals了
  14. 通过swagger将API业务版本号与Gitlab代码版本号绑定
  15. ps怎么撤销的三种方法和ps撤销快捷键以及连续撤销多步快捷键
  16. ubuntu14 安装 端口转发工具rinetd
  17. postman—集成到jenkins
  18. chrome://命令
  19. mybatis_mybatis写mapper文件注意事项
  20. 【Django实例】博客1

热门文章

  1. NFS启动时报错Linux NFS:could not open connection for tcp6
  2. BZOJ-2330-[SCOI2011]糖果(差分约束)
  3. Python爬虫入门:URLError异常处理
  4. 使用js获取数组中最大、最小的数字
  5. ab使用命令
  6. C# Ioc容器Unity,简单实用
  7. 使用javax.script包实现Java设置JS脚本中的变量
  8. [转载] linux中文件描述符fd和文件指针flip的理解
  9. Scratch——教小孩子学编码
  10. .net core2.0下使用Identity改用dapper存储数据