HDU 4539  郑厂长系列故事――排兵布阵

基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态),

直接套了一个4重循环居然没超时我就呵呵了

  1 //#pragma comment(linker,"/STACK:102400000,102400000")
  2 #include <map>
  3 #include <set>
  4 #include <stack>
  5 #include <queue>
  6 #include <cmath>
  7 #include <ctime>
  8 #include <vector>
  9 #include <cstdio>
 10 #include <cctype>
 11 #include <cstring>
 12 #include <cstdlib>
 13 #include <iostream>
 14 #include <algorithm>
 15 using namespace std;
 16 #define INF 1e8
 17 #define inf (-((LL)1<<40))
 18 #define lson k<<1, L, mid
 19 #define rson k<<1|1, mid+1, R
 20 #define mem0(a) memset(a,0,sizeof(a))
 21 #define mem1(a) memset(a,-1,sizeof(a))
 22 #define mem(a, b) memset(a, b, sizeof(a))
 23 #define FOPENIN(IN) freopen(IN, "r", stdin)
 24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
 25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
 26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
 27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
 28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
 29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
 30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
 31
 32 //typedef __int64 LL;
 33 //typedef long long LL;
 34 const int MAXN = 10000;
 35 const int MAXM = 100005;
 36 const double eps = 1e-13;
 37 //const LL MOD = 1000000007;
 38
 39 int N, M;
 40 int ma[110];
 41 int dp[2][200][200];
 42
 43 int stNum;
 44 int st[1000], num[1000];
 45
 46 int judge(int x)
 47 {
 48     if(x & (x<<2)) return 0;
 49     return 1;
 50 }
 51
 52 int get1(int x)
 53 {
 54     int ret = 0;
 55     while(x)
 56     {
 57         ret += x & 1;
 58         x >>= 1;
 59     }
 60     return ret;
 61 }
 62
 63 void init()
 64 {
 65     mem1(dp);mem0(ma);
 66     stNum = 0;
 67     for(int i=0;i<(1<<M);i++) if(judge(i))
 68     {
 69         st[stNum] = i;
 70         num[stNum++] = get1(i);
 71     }
 72 }
 73
 74
 75 int main()
 76 {
 77     //FOPENIN("in.txt");
 78     while(~scanf("%d %d%*c", &N, &M))
 79     {
 80         init();
 81         int x, cur = 0;
 82         for(int i=1;i<=N;i++)
 83             for(int j=0;j<M;j++) {
 84                 scanf("%d", &x);
 85                 if(x==0) ma[i] |= (1<<j);
 86             }
 87         for(int i=0;i<stNum;i++) {
 88             if(st[i] & ma[1]) continue;
 89             dp[cur][i][0] = num[i];
 90         }
 91         for(int r = 2; r <= N; r ++)
 92         {
 93             cur = !cur;
 94             for(int i = 0; i < stNum; i ++)
 95             {
 96                 if(st[i] & ma[r]) continue;
 97                 for(int j = 0; j < stNum; j ++ )
 98                 {
 99                     if(st[j] & ma[r-1]) continue;
100                     int p = (st[i]<<1) | (st[i]>>1);
101                     if(st[j] & p) continue;
102                     for(int k = 0; k < stNum; k ++) if(dp[!cur][j][k] != -1)
103                     {
104                         int pp = st[i] | ((st[j]<<1) | (st[j]>>1));
105                         if(st[k] & pp) continue;
106                         dp[cur][i][j] = MAX(dp[cur][i][j], dp[!cur][j][k] + num[i]);
107                     }
108
109                 }
110             }
111         }
112         int ans = 0;
113         for(int i=0;i<stNum;i++) for(int j=0;j<stNum;j++)
114             ans = MAX(ans, dp[cur][i][j]);
115         printf("%d\n", ans);
116     }
117     return 0;
118 }
119
120
121 /*
122
123 6
124 3
125 2
126 12
127
128 */

转载于:https://www.cnblogs.com/gj-Acit/p/3888325.html

HDU 4539郑厂长系列故事――排兵布阵(状压DP)相关推荐

  1. hdu 4539 郑厂长系列故事——排兵布阵

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  2. HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  3. HDU 4539 郑厂长系列故事――排兵布阵

    /* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一 ...

  4. 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  5. 郑厂长系列故事——排兵布阵 状态压缩DP

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  6. HDU-4539 郑厂长系列故事——排兵布阵 状态压缩DP Or 最大团

    题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的.问在方格中最多能够放置多少个士兵. 分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状 ...

  7. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Other ...

  8. hdu-4539 郑厂长系列故事――排兵布阵(状态压缩)

    类似于poj-1185 //曼哈顿距离 d = |x1 - x2| + |y1 - y2| //解决曼哈顿距离冲突 s[i]&(s[j] << 1)||s[i]&(s[j] ...

  9. HDU4539-郑厂长系列故事——排兵布阵

    郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上 他是带兵打仗的团长 一天,郑厂长带着他的军队来到了一个nm的平原准备布阵. 根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离 ...

最新文章

  1. ReadResolve方法与序列化
  2. 用于生成随机数的python标准库模块是_17 Python 标准库之 random 模块 - Python 进阶应用教程...
  3. dcf是ea211发动机吗_大众有的车怎么把ea211换成dcf了?
  4. (转)字典树原理+实现
  5. python安装poi第三方库_使用Python获取城市POI数据
  6. mysql shell无法启动服务_[shell脚本] mysql服务启动脚本
  7. 从大到小输出a、b、c(选择结构)
  8. ios swift 实现饼状图进度条,swift环形进度条
  9. python string 编解码(encode b64encode)
  10. FPGA驱动USB协议芯片的测试
  11. spring cloud SnakeYAML RCE 漏洞复现
  12. 大数据智能算法及测评技术
  13. 台式计算机连接无线,台式机怎么连接wifi?台式机怎么连接无线网络的方法
  14. win系统中打印机驱动点击打开,没反应的解释
  15. C++ 引用 (Reference)
  16. windows 大文件共享传输错误 0X8007003B
  17. 设计模式学习笔记(一):抽象工厂
  18. Velodyne Lidar公布自动驾驶技术世界安全峰会的议程
  19. dp-最长公共子序列
  20. 美股暴跌2000点一夜蒸发21万亿;美国一新冠病毒疫苗进入临床试验

热门文章

  1. C#中 .resx文件
  2. UITableView 滑动删除
  3. Unity初步 基本拼图实现
  4. Linux分区、LVM等简述
  5. rocketMq - commitLog
  6. 【单页应用】全局控制器app应该干些什么?
  7. 自动化安装Cacti(1.0.1/2/3)脚本
  8. Chromium 组件DotNetBrowser V1.12发布 | Chromium引擎升级到版本60
  9. 《大型网站服务器容量规划》一2.1 什么是容量
  10. enum类型被intent所携带时需要注意的地方