炮兵阵地 poj-1185

    题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数。

    注释:n<=100,m<=10。然后只能在平原的地方建立炮兵。

      想法:第2到状压dp,++。这题显然是很经典的。设状态dp[i][j][k]表示第i行的状态为j,i-1行的状态为k的最多炮兵数。在转移时,枚举所有的合法炮兵排列(此处的合法数目是根据一行全为平原的时候能放置的合法炮兵数目),然后内层循环枚举dp[i-1]的i-1状态,进行特判更新即可。统计答案时,我们只需对于dp[n]的所有可能状态求最大值即可。

    最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int dp[105][65][65];
  6. int cnt=0;
  7. int str[65];
  8. int sum[65];
  9. int map[110];
  10. char s[110][110];
  11. bool check(int x)//判断这个排列是否为普通的合法序列
  12. {
  13. if(x&(x<<1)) return false;
  14. if(x&(x<<2)) return false;
  15. return true;
  16. }
  17. int getSum(int x)//当前状态的炮兵数目
  18. {
  19. int ans=0;
  20. while(x>0)
  21. {
  22. if(x&1) ans++;
  23. x>>=1;
  24. }
  25. return ans;
  26. }
  27. void before_hand(int mid)//预处理出所有的可能合法炮兵状态,cnt统计状态数
  28. {
  29. for(int i=0;i<(1<<mid);i++)
  30. {
  31. if(check(i))
  32. {
  33. str[cnt]=i;//str数组记录状态,dp中的j和k都是str数组的下标
  34. sum[cnt]=getSum(i);
  35. cnt++;
  36. }
  37. }
  38. }
  39. int main()
  40. {
  41. int n,m;
  42. scanf("%d%d",&n,&m);
  43. memset(dp,-1,sizeof dp);
  44. for(int i=0;i<n;i++)
  45. {
  46. for(int j=0;j<m;j++)
  47. {
  48. char a;
  49. cin >> a;
  50. if(a=='H') map[i]|=(1<<j);//统计每一行的不合法格子状态
  51. }
  52. }
  53. before_hand(m);//其实可以不传参
  54. for(int i=0;i<cnt;i++)
  55. {
  56. if(!(str[i]&map[0])) dp[0][0][i]=sum[i];//先处理出第一行的情况
  57. }
  58. for(int r=1;r<n;r++)//枚举行数
  59. {
  60. for(int i=0;i<cnt;i++)//枚举当前行的排列
  61. {
  62. if(str[i]&map[r]) continue;
  63. for(int j=0;j<cnt;j++)//枚举上一行的排列情况
  64. {
  65. if(str[i]&str[j]) continue;
  66. for(int k=0;k<cnt;k++)//枚举i-2行的排列情况
  67. {
  68. if(str[i]&str[k]) continue;
  69. if(dp[r-1][k][j]==-1) continue;
  70. dp[r][j][i]=max(dp[r][j][i],dp[r-1][k][j]+sum[i]);//更新即可
  71. }
  72. }
  73. }
  74. }
  75. int ans=0;//统计答案
  76. for(int i=0;i<cnt;i++)
  77. {
  78. for(int j=0;j<cnt;j++)
  79. {
  80. ans=max(ans,dp[n-1][i][j]);
  81. }
  82. }
  83. printf("%d\n",ans);
  84. return 0;
  85. }

    小结:这道题非常经典,我们有一种用空间换时间的办法就是4维dp。

      错误:卧槽!!一定牢记...判断时用的是运算符&而不是&&!!!

[poj1185]炮兵阵地_状压dp的更多相关文章

  1. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...

  2. poj1185 炮兵阵地【状压DP】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32802   Accepted: 12650 Descriptio ...

  3. 【POJ1185】炮兵阵地(状压DP)

    题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...

  4. poj1185:炮兵阵地(状压dp)

    也算是比较基础的状压dp了,跟做过的第二道比较又稍微复杂了一点 需要记录之前两行的状态.. 统计结果也稍有不同 另外还学习了一个得到一个整数二进制位 1 的个数的位运算方法 详见代码: #includ ...

  5. POJ 1185 炮兵阵地(状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

  6. POJ P1185 炮兵阵地 【状压dp】

    炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...

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

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

  8. [NOI2001]炮兵阵地 【状压DP】

    #\(\color{red}{\mathcal{Description}}\) \(Link\) 司令部的将军们打算在\(N \times M\)的网格地图上部署他们的炮兵部队.一个\(N \time ...

  9. [NOI2001] 炮兵阵地 (状压Dp经典例题)

    如果您的电脑比较优秀能在 1sec 内跑过 2^1000 的时间复杂度,不妨你可以尝试一下,其实实际时间复杂度远远少于 2^1000,作为骗分不错的选择QAQ,然后我们来分析一下正解: 很显然此题是一 ...

随机推荐

  1. Vxworks 6.6系列下载地址

    Vxworks 6.6系列下载地址: ---------------------------------- ftp://ftp.windriver.speedera.net/ftp.windriver ...

  2. Linux以字节显示内存大小

    Linux以字节显示内存大小 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -b total used free shared buffers ca ...

  3. 用OpenStack界面轻松创建虚拟机的你,看得懂虚拟机启动的这24个参数么?

    看这篇文章之前,保证看过以下文章: 我是虚拟机内核我困惑?! Qemu,KVM,Virsh傻傻的分不清 裸用KVM创建虚拟机,体验virtualbox为你做的10件事情 大家从OpenStack页面上 ...

  4. 从html页面加载顺序来更好的理解jquery初始化

    一,html页面加载顺序 1,用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件:2,浏览器开始载入html代码,发现<head>标签内 ...

  5. ListView 无 DataSource 依然用 DataPager 翻页

    ListView 有 DataSource 使用 DataPager 翻页ListView 无 DataSource 使用 DataPager 翻页问题描述点击两次才能翻页返回上一页,内容为空解决方法 ...

  6. RobotFramework自动化测试框架的基础关键字(一)

    1.1.1        如何搜索RobotFramework的关键字 有两种方式可以快速的打开RIDE的关键字搜索对话框 1.选择菜单栏Tools->Search Keywords,然后会出现 ...

  7. Codeforces Round #446 (Div. 2)

    Codeforces Round #446 (Div. 2) 总体:rating涨了好多,虽然有部分是靠和一些大佬(例如redbag和ShichengXiao)交流的--希望下次能自己做出来2333 ...

  8. 【HDU4622】Reincarnation(后缀自动机)

    [HDU4622]Reincarnation(后缀自动机) 题面 Vjudge 题意:给定一个串,每次询问l~r组成的子串的不同子串个数 题解 看到字符串的大小很小 而询问数太多 所以我们预处理任意的 ...

  9. 【MyBatis源码分析】Configuration加载(下篇)

    元素设置 继续MyBatis的Configuration加载源码分析: private void parseConfiguration(XNode root) { try { Properties s ...

  10. ubuntu16.04 安装常见问题解决方案------输入法黑框

    我的系统是 lubuntu 16.04 刚安装输入法候选字的地方全是黑框,然后百度查到了 compton 和 xcompmgr 这两个说是窗口微调 透明 ,这两个方法对我的系统不管用 .各位如果遇到黑 ...