POJ 3254 简单状压DP
2024-10-15 16:29:34
没什么可说的,入门级状压DP。直接撸掉
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <set>
#define LL long long
#define FOR(i, x, y) for(int i=x;i<=y;i++)
using namespace std;
const int maxn = 5000;
const int MOD = 100000000;
int N, M, K;
int C[20], state[maxn];
int dp[20][maxn];
bool judge(int x)
{
if(x & (x << 1)) return false;
return true;
}
void init()
{
memset(dp, 0, sizeof(dp));
memset(state, 0, sizeof(state));
memset(C, 0, sizeof(C));
int r = (1 << M) - 1; K = 0;
FOR(i, 0, r) if(judge(i)) state[++K] = i;
}
int main()
{
while(scanf("%d %d", &N, &M)!=EOF)
{
init();
int X;
FOR(i, 1, N)
FOR(j, 1, M)
{
scanf("%d", &X);
if(X == 0) C[i] = C[i] | (1 << (M - j));
}
FOR(i, 1, K)
{
if(!(state[i] & C[1])) dp[1][i] = 1;
} FOR(i, 2, N)
FOR(j, 1, K)
{
if(C[i-1] & state[j]) continue;
FOR(l, 1, K)
{
if((C[i] & state[l]) || (state[l] & state[j])) continue;
dp[i][l] = (dp[i-1][j] + dp[i][l]) % MOD;
}
}
int ans = 0;
FOR(i, 1, K) ans = (ans + dp[N][i]) % MOD;
printf("%d\n", ans);
}
return 0;
}
最新文章
- bootstrapvalidator+bootstrap-select select无法校验问题解决方法
- Ubuntu 手工挂载硬盘
- KMP 算法
- GJM : Unity3D 常用网络框架与实战解析 【笔记】
- 第二章 存储,2.2 AliCloudDB--双11商家后台数据库的基石(作者:玄惭)
- 在创维E900-S悦Me盒子上安装第三方软件
- Web前端代码规范与页面布局
- defer属性---->;执行外部脚本
- 使用本地光盘安装Microsoft .NET Framework 3.5 for Win8.1/WinServer2012R2
- c &; c++中const
- Joomla安装图文教程 (送 Joomla 中文语言包)
- AlarmManager类的应用(实现闹钟功能)
- 记关于 Lambda 表达式的基础写法
- perl 简单后门程序
- log4j日志输出性能优化-缓存、异步
- QPropertyAnimation实现图形,控件的旋转和位移动画,尤其是旋转
- 2018/12.21:函数this的指向
- 【C语言基础】循环体系
- IDEA中,将项目加入maven管理。
- 获取ADO连接字符串