【POJ3254】Corn Fields
2024-08-27 09:32:26
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 ;
}
最新文章
- codeforces 360 C - NP-Hard Problem
- 转: 使用virtualenv搭建独立的Python环境
- MusigCV安装
- mysql去掉字段字符中间空格
- node js npm 和 cnpm的使用
- 2 _RESETFUL介绍
- php_Symfony_项目实战全过程记录
- 3.struts2访问Servlet API,并和mybaits实现全套增删改查
- 阿里舆情︱舆情热词分析架构简述(Demo学习)
- selenium 爬虫
- java学习之静态内部类
- 转 Postman访问Webapi的Get/Post/Put/Delte请求
- 再也不用担心面试官问你HashCode和equals了
- 通过swagger将API业务版本号与Gitlab代码版本号绑定
- ps怎么撤销的三种方法和ps撤销快捷键以及连续撤销多步快捷键
- ubuntu14 安装 端口转发工具rinetd
- postman—集成到jenkins
- chrome://命令
- mybatis_mybatis写mapper文件注意事项
- 【Django实例】博客1
热门文章
- NFS启动时报错Linux NFS:could not open connection for tcp6
- BZOJ-2330-[SCOI2011]糖果(差分约束)
- Python爬虫入门:URLError异常处理
- 使用js获取数组中最大、最小的数字
- ab使用命令
- C# Ioc容器Unity,简单实用
- 使用javax.script包实现Java设置JS脚本中的变量
- [转载] linux中文件描述符fd和文件指针flip的理解
- Scratch——教小孩子学编码
- .net core2.0下使用Identity改用dapper存储数据