poj1185

题意

给出字母矩阵,只能在字母为 P 的位置放置大炮,



如图所示,每个大炮的射程固定,现在要求尽可能多的放大炮,且使得每个大炮都不在其它大炮的射程内。问最多能放多少。

分析

poj3254

很类似的一道题,但是注意到这道题,放置一个大炮后,不仅影响到与之相邻的下一行,同时对下下一行产生影响,也就是说某一个地点能否存在大炮,取决于它上面两行的状态,那么状态的转移就和上面两行有关,两层循环枚举上面两层的可行状态,判断加上这一层的状态后是否合法(即对于连续的 3 行,每一列最多只能存在一个 1),如果合法,加上这个状态下在这一行最多能放大炮的数量,不断更新最大值。

可以预处理一行的状态,求得同时在这一行最多放几个大炮。

code

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<string>
  5. using namespace std;
  6. typedef long long ll;
  7. const int MAXN = (1 << 10) + 10;
  8. int dp[105][MAXN][MAXN];
  9. int num[1 << 10];
  10. string str;
  11. bool check(int j, int s) { // 判断 j 是否是一个可行状态
  12. return (j | s) == s && (j & (j >> 1)) == 0
  13. && (j & (j >> 2)) == 0;
  14. }
  15. void F(int n) {
  16. vector<int> v;
  17. if(!n) cout << 0;
  18. while(n) {
  19. v.push_back(n & 1);
  20. n /= 2;
  21. }
  22. for(int i = v.size() - 1; i >= 0; i--) {
  23. cout << v[i];
  24. }
  25. }
  26. int main() {
  27. int n, m;
  28. cin >> n >> m;
  29. for(int i = 0; i < (1 << m); i++) {
  30. int k = 0;
  31. for(int j = 0; j < 11; j++) {
  32. if(!k) {
  33. if((i >> j) & 1) {
  34. k = 3;
  35. num[i]++;
  36. } else k = 1;
  37. }
  38. k--;
  39. }
  40. }
  41. vector<int> vec1, vec2, vec3; // vec2存上一层的可行状态,vec1存上上一层的可行状态
  42. int ans = 0;
  43. for(int i = 0; i < n; i++) {
  44. cin >> str;
  45. int s = 0;
  46. for(int j = 0; j < m; j++) {
  47. if(str[j] == 'P') {
  48. s |= (1 << j);
  49. }
  50. }
  51. if(i > 1) {
  52. vec3.clear();
  53. for(int j = 0; j < (1 << m); j++) {
  54. if(check(j, s)) {
  55. for(int v = 0; v < vec1.size(); v++) {
  56. for(int e = 0; e < vec2.size(); e++) {
  57. if((j & vec1[v]) == 0 && (j & vec2[e]) == 0 && (vec1[v] & vec2[e]) == 0) { // 保证连续 3 行每一列最多只有一个 1
  58. dp[i][j][vec2[e]] = max(dp[i][j][vec2[e]], dp[i - 1][vec2[e]][vec1[v]] + num[j]);
  59. ans = max(ans, dp[i][j][vec2[e]]);
  60. }
  61. }
  62. }
  63. vec3.push_back(j);
  64. }
  65. }
  66. vec1 = vec2;
  67. vec2 = vec3;
  68. } else if(!i) {
  69. for(int j = 0; j < (1 << m); j++) {
  70. if(check(j, s)) {
  71. dp[i][j][0] = num[j];
  72. ans = max(ans, num[j]);
  73. vec1.push_back(j);
  74. }
  75. }
  76. } else {
  77. for(int j = 0; j < (1 << m); j++) {
  78. if(check(j, s)) {
  79. for(int k = 0; k < vec1.size(); k++) {
  80. if((j & vec1[k]) == 0) {
  81. dp[i][j][vec1[k]] = dp[i - 1][vec1[k]][0] + num[j];
  82. ans = max(ans, dp[i][j][vec1[k]]);
  83. }
  84. }
  85. vec2.push_back(j);
  86. }
  87. }
  88. }
  89. }
  90. cout << ans << endl;
  91. return 0;
  92. }

poj1185(状态压缩DP)的更多相关文章

  1. POJ1185状态压缩DP

    难得的中文题. POJ1185http://poj.org/problem?id=1185 方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数.而这里p受到r的限制,而 ...

  2. POJ1185 - 炮兵阵地(状态压缩DP)

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

  3. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  4. 状态压缩DP总结

    POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...

  5. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  6. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  7. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  8. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  9. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  10. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

随机推荐

  1. 【Kth Smallest Element in a BST 】cpp

    题目: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. ...

  2. Dapper 学习笔记

    一.基础 1.Dapper代码就一个SqlMapper.cs文件, 前人测试Dapper速度较快 的Orm,读取速度接近IDataReader,超过DataTable. 2.a.下载地址 https: ...

  3. Percona-Tookit工具包之pt-summary

      Preface       As a dba,We are obliged to master several basic tools(such as vmstat,top,netstat,ios ...

  4. svn 数据库 账号密码

    47.106.107.201 云商传媒李孔文 2018/8/22 19:26:35 root 云商传媒李孔文 2018/8/22 19:26:39 sn123456 云商传媒李孔文 2018/8/22 ...

  5. php天龙八部

    <?php /* 一.操作步骤: 连接MySQL数据库 判断是否连接成功 选择数据库 设置字符集 准备SQL语句 向MySQL服务发送SQL语句 解析处理结果集 释放结果集,关闭数据库连接 */ ...

  6. [译]在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?

    原文来源: https://stackoverflow.com/questions/7828867/how-to-efficiently-compare-two-unordered-lists-not ...

  7. java值转递?引用传递?

    值传递是传递的是原值的副本,引用传递传递的是原值. 在Java中,如果是基本数据类型,传递的是该参数字面量值的拷贝.如果是引用数据类型,传递的是该参数所引用对象在堆中地址的拷贝. swap(int a ...

  8. bzoj1264 [AHOI2006]基因匹配Match 树状数组+lcs

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1255  Solved: 835[Submit][ ...

  9. javaScript构造函数、原型、面向对象编程

    js最重要也是最核心的东西就是对象了,入行这么长时间,一直对面向对象一知半解.网上有很多介绍对象对象的内容,这里也做了很多借鉴, 尤其是阮一峰老师的文章.我这里写的大多例子都是阮一峰老师文章的例子,但 ...

  10. Mysql性能优化【转】

    mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF ...