hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
来源:互联网 发布:秩为1矩阵的几 编辑:程序博客网 时间:2024/05/21 09:25
参考:http://blog.csdn.net/u013480600/article/details/19758029
参考了下思路,还是经验不足,找不对状态。做的时候传错了个参数,调了半个多小时
注意边界情况。
虽然思路看的别人的,但是自己写出来代码还是很爽的
做的时候0表示能够放士兵的位置,方便后边处理。
理解都在注释里。
#include <bits/stdc++.h>using namespace std;int dp[101][250][250];int rec[250];int row[101];int n,m;/*1表示我的兵的位置能坐下的地方全都是0如果我的兵全部都能放下则我的1对应的全部都是0则按位与运算结果为0才合法所以座位要01互相取反,使0为合法位置*/int calc(int num){ int ret = 0; while(num) { if(num&1) ret++; num >>= 1; } return ret;}//判断上下两行是否兼容bool check(int up, int down){ for(int i = 0; i < m; ++i) { if(i == 0) if((up&1)&((down>>1)&1)) return false; if(i == m-1) if(((up>>i)&1)&((down>>(i-1))&1)) return false; if(((up>>i)&1)&((down>>(i-1))&1) || ((up>>i)&1)&((down>>(i+1))&1)) return false; } return true;}//判断当前行与上一行的上一行是否兼容bool judge(int now, int pre){ for(int i = 0; i < m; ++i) if((now>>i)&(pre>>i)) return false; return true;}int main(){ int x = 1<<10,k=0,t; for(int i = 0; i < x; ++i) { if(i&(i<<2)) continue; rec[k++] = i; } rec[k] = x; while(scanf("%d %d",&n,&m) != EOF) { if(n == 0 || m == 0) { printf("0\n"); continue; } memset(dp,0,sizeof(dp)); memset(row,0,sizeof(row)); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { scanf("%d",&t); row[i] = (row[i]<<1)|!t; } } x = 1<<m; int res = 0; //单独计数第0行 for(int i = 0; rec[i] < x; ++i) { if(!(row[0]&rec[i])) { dp[0][i][0] = calc(rec[i]); res = max(res,dp[0][i][0]); } } if(n == 1) { printf("%d\n",res); continue; } //单独计数第一行 for(int i = 0; rec[i] < x; ++i) if(!(row[1]&rec[i]))//如果第二行能放在第二行 for(int j = 0; rec[j] < x; ++j) if(!(row[0]&rec[j]))//如果第一行能成功放在第一行 //接下来只需要判断两行是否兼容 if(check(rec[j],rec[i])) { dp[1][i][j] = calc(rec[i]) + calc(rec[j]); res = max(res,dp[1][i][j]); } for(int r = 2; r < n; ++r) { for(int i = 0; rec[i] < x; ++i)//i表示当前行 { if(!(row[r]&rec[i])) { for(int j = 0; rec[j] < x; ++j)//j表示当前行的上一行 { if(!(row[r-1]&rec[j]))//还要表示出来j的上一行 { for(int k = 0; rec[k] < x; ++k) { if(!(row[r-2]&rec[k])) { if(check(rec[j],rec[i]) && judge(rec[i],rec[k])) { dp[r][i][j] = max(dp[r][i][j],dp[r-1][j][k]+calc(rec[i])); res = max(res,dp[r][i][j]); } } } } } } }// printf("%d\n",res); } printf("%d\n",res); } return 0;}
阅读全文
0 0
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩DP)
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- 状态压缩dp hdu 4539 郑厂长系列故事——排兵布阵
- hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩dp
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩+dp;
- hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
- HDU 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- HDU 4539 郑厂长系列故事——排兵布阵 (状态压缩DP)
- HDU ACM 4539 郑厂长系列故事——排兵布阵->状态压缩DP
- 【状态压缩DP】 HDU 4539 郑厂长系列故事——排兵布阵
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
- (待解决) hdu HDU4539 郑厂长系列故事——排兵布阵 (状态压缩dp~)
- HDOJ 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- 状态压缩(1) Hdu 4539 郑厂长系列故事——排兵布阵
- Hdu 4539 郑厂长系列故事——排兵布阵 状态压缩
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩)
- 福州大学第十四届程序设计竞赛_重现赛 A Salty Fish
- Java程序员必须掌握的线程知识-Callable和Future
- redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
- 【数据结构】对数运行时间算法(折半查找、最大公约、幂运算)
- Java中CAS详解,分析的通俗易懂
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- BeanUtils 初探
- python3 selenium web自动化测试之excel参数化
- java经典面试题
- 【linux驱动分析】之dm9000驱动分析
- RHCE易忽视知识点补充
- Andrew Ng Neural-networks-deep-learning 课程笔记一
- 【memcache缓存专题(1)】memcache的介绍与应用场景
- 配置 gradle 当地目录。