文章标题
2015-06-26 15:18
225 查看
题目描述:
n×m场地,行不可相邻,上下不可相邻,场地中有不可选的地方,求可能数。题解:
法一:矩阵上的dp,那么就一个格子一个格子的去看,需要考虑的状态仍然有上面的和左边的,其他的就不用判断了.那么复杂度是n*n*2^n,应该可以做,没有写..法二:提供了一个新的思路,每一行先处理出来可能合法的情况,就是相邻是间隔的二进制,那么直接枚举这一行怎么填,之后再检验,和上一行检验,和本行不能填的检验.这样是n*2^n*2^n.不知道这种方法有什么好…重点:
矩阵上状压dp,如果一行可以直接压缩,会加快速度.代码:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <ctype.h> #include <limits.h> #include <cstdlib> #include <algorithm> #include <vector> #include <queue> #include <map> #include <stack> #include <set> #include <bitset> #define CLR(a) memset(a, 0, sizeof(a)) #define REP(i, a, b) for(int i = a;i < b;i++) #define REP_D(i, a, b) for(int i = a;i <= b;i++) typedef long long ll; using namespace std; const int maxn = (1<<12) + 100; const int MOD = 1e8+ 0.1; int n, m; int a[20][20], f[20]; int dp[20][maxn]; vector<int> get_statu; int cheack(int x)//判断有相邻的东西,构造出11连续的取& { REP_D(k, 0, n - 2) { if((((3<<k)&x)>>k) == 3) return 0; } return 1; } void get_get_statu()//预处理 { int key = (1<<n) - 1; get_statu.clear(); //int s_n = 0; REP_D(k, 0, key) { if(cheack(k)) { get_statu.push_back(k); } } } void get_dp() { REP_D(i, 1, m)//初始化 { int temp = 0; REP(j, 0, n) { if(a[i][j] == 1) { ; } else { temp = (temp|(1<<j)); } } f[i] = temp; } CLR(dp); dp[0][0] = 1; REP_D(i, 1, m) { REP(j, 0, get_statu.size()) { REP(k, 0, get_statu.size()) { if((get_statu[j]&f[i]) == 0&&(get_statu[j]&get_statu[k])==0) { dp[i][get_statu[j]] = (dp[i][get_statu[j]] + dp[i - 1][get_statu[k]])%MOD; } } } } int ans = 0; REP(i, 0, get_statu.size()) { ans = (ans + dp[m][get_statu[i]])%MOD; } printf("%d\n", ans); } void solve() { get_get_statu(); get_dp(); } int main() { //freopen("4Din.txt", "r", stdin); //freopen("4Dout.txt", "w", stdout); while(scanf("%d%d", &m, &n) != EOF) { REP_D(i, 1, m) { REP(j, 0, n) { scanf("%d", &a[i][j]); } } solve(); } return 0; }
相关文章推荐
- aidl is missing
- SQLite3中的日期时间函数使用小结
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- JVM学习笔记(二)------Java代码编译和执行的整个过程
- gitlab ActionView::Template::Error (undefined method `[]' for nil:NilClass): 500错误
- Spring整合RMI
- 合并两个有序数组
- MAC命令 和 vi命令
- JVM学习笔记(一)------基本结构
- 查找当前SQL Server下的Active Session正连接着哪个数据库
- 手机浏览器全屏模式
- JVM学习笔记(一)------基本结构
- 关于背景图片定位问题
- 66. Plus One
- javascript实现textarea中tab键的缩排处理方法
- mysql5.6迁移到mariadb
- android平台led开发之内核硬件驱动层(一)
- Nginx日志管理和切割
- cinder创建volume流程简介
- Android单元测试