题目链接:http://poj.org/problem?id=1185

思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到递推方程:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+num[j]);(其中num[j]为该状态下可以放置的士兵的个数。至于具体怎么分析,这位大牛讲的很清楚:http://www.cnblogs.com/scau20110726/archive/2013/02/27/2935256.html

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int dp[111][77][77];
 8 int row[111];
 9 int s[1<<12];//保存所有士兵合法的状态
10 int num[1<<12];
11 int n,m,ans,state;
12 char str[111];
13
14 int Get_Num(int x)
15 {
16     int cnt=0;
17     while(x>0){
18         cnt++;
19         x=x&(x-1);
20     }
21     return cnt;
22 }
23
24 int main()
25 {
26     while(~scanf("%d%d",&n,&m)){
27         memset(row,0,sizeof(row));
28         memset(dp,0,sizeof(dp));
29         memset(num,0,sizeof(num));
30         for(int i=0;i<n;i++){
31             scanf("%s",str);
32             for(int j=0;j<m;j++){
33                 if(str[j]=='H')row[i]=(row[i]<<1)|1;
34                 else row[i]<<=1;
35             }
36         }
37         state=0;
38         for(int i=0;i<(1<<m);i++){
39             if((i&(i<<1))||(i&(i<<2)))continue;
40             s[state]=i; //合法状态
41             num[state++]=Get_Num(i);//可以放置的士兵个数
42         }
43         for(int i=0;i<state;i++){
44             if(s[i]&row[0])continue;
45             dp[0][i][0]=num[i];
46         }
47         for(int i=1;i<n;i++){
48             for(int j=0;j<state;j++){
49                 if(row[i]&s[j])continue;
50                 for(int k=0;k<state;k++){
51                     if(s[j]&s[k])continue;  //i行与i-1行士兵相互攻击
52                     for(int l=0;l<state;l++){
53                         if(s[j]&s[l])continue;//i行与i-2行士兵相互攻击
54                         if(s[k]&s[l])continue;//i-1行与i-2行士兵相互攻击
55                         dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+num[j]);
56                     }
57                 }
58             }
59         }
60         ans=0;
61         for(int i=0;i<state;i++){
62             for(int j=0;j<state;j++){
63                 ans=max(ans,dp[n-1][i][j]);
64             }
65         }
66         printf("%d\n",ans);
67     }
68     return 0;
69 }
70
71
72
73
74
75
76                 

View Code

poj 1185(状压dp)相关推荐

  1. poj 3254 状压dp

    E - Corn Fields Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  2. Corn Fields(POJ 3254状压dp)

    题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...

  3. POJ 2430 状压DP

    题意: 思路: 先预处理出所有格子的statement statement=1–>只有上边的格子被覆盖 statement=2–>只有下边的格子被覆盖 statement=3–>上下 ...

  4. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  5. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  6. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  7. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  8. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  9. 【POJ 3311】Hie with the Pie(状压DP)

    Hie with the Pie 题目链接:POJ 3311 题目大意 给你 n+1 个点,其中 0 号点是特殊点. 然后两个点之间都有路径可以走. 然后你要从特殊点出发走过所有点回到特殊点,问你最短 ...

最新文章

  1. mybatis源码分析之事务管理器
  2. 1562. [NOI2009]变换序列【二分图】
  3. c语言编写程序数一下 1到100的所有整数中出现多少次数字9
  4. AI公开课:19.02.27周逵(投资人)《AI时代的投资逻辑》课堂笔记以及个人感悟
  5. 解决Ubuntu无法进行SSH连接的问题(以及如何使用SSH)
  6. 两圆相交求面积 hdu5120
  7. 3-8 译码器设计实验--VHDL
  8. python什么时候用进程什么时候用线程_Python多线程/多进程释疑:为啥、何时、怎么用?...
  9. CVPR 2021 机器学习及多模态最新进展分享
  10. 微软彻底告别移动操作系统!
  11. 2015蓝桥杯C++A:饮料换购
  12. 一个关于mahout0.5放置位置的错误,,,
  13. 对代码更有信心--单元测试工具Mockito简单介绍
  14. 使用 .NET HttpClient 下载 PDF 文件的DEMO
  15. 《山月记》一定有那么一刻,我们曾迷茫怀疑
  16. 金融行业市场策划案例(共12份)
  17. 一朵花的组成结构图_花是由哪几个部分组成的?
  18. End event threw exception
  19. JavaSE学习总结第01天_Java概述
  20. 反素数(反转拼写的素数)

热门文章

  1. HTTP协议中的Tranfer-Encoding:chunked编码解析
  2. Repeater控件的分页问题
  3. C++中指向类成员指针的用法
  4. python考试pass or fail_请问老师为什么我输入的数据,预期结果是pass,我的预期因该是“fail”...
  5. mac上mysql关闭不了了_python操作mysql数据库
  6. 食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
  7. bldc不同载波频率_广播百科 频率调制
  8. 使用Maven 打包项目 生成XXX.tar.gz 文件
  9. uniapp富文本复制文字内容
  10. 17-flutter导航栏渐变效果