题目描述

阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了。现在,零崎要在地图上布置一片阿姆斯特朗回旋加速式阿姆斯特朗炮,那么在N行M列单位长度大小的地图上,求解阿姆斯特朗回旋加速式阿姆斯特朗炮最大的部署数量和对应部署方案总数。

输入

每组输入一行,为两个整数N,M (N <= 100;M <= 10)

输出

每组一行两个整数,

第一个为阿姆斯特朗回旋加速式阿姆斯特朗炮的个数,第二个为此数量下的摆放方式总数。

输入样例

3 3

输出样例

3 6

Hint

100   1为阿姆斯特朗回旋加速式阿姆斯特朗炮的位置,方案不唯一。
010
001

状态压缩是一种特殊的技巧,不止可以用在dp中。状态压缩其实是在利用数据结构,由于基础数据类型int有32位,一个int变量就可以表示2^32个状态。状态压缩其实是一种优化方法,有很大局限性。第一,单元状态通常只有两种(0、1,其实多了压缩的道理是一样的,但是没有位运算就没什么优势了),第二,单元维度通常不超过50 ( int才32,多了longlong都爆掉难道用高精度大整数压缩不成……)

状压dp本质上还是dp,问题大多数还是求解最大值或者解决方案总数之类的,但是状态数量巨大普通方法难以表示,所以利用整数可以将状态维度压缩到1维。

题目来源:http://biancheng.love/contest/10/problem/G/index

解题思路:

状态压缩dp问题。

关于状态压缩问题参见:http://www.cnblogs.com/avril/p/3282295.html

其他状态压缩DP问题:【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】

给出本题代码:

 1 #include <bits/stdc++.h>
 2 #define INF 99999999
 3 typedef long long LL;
 4 using namespace std;
 5
 6 const int MAX=100+10;
 7 int n,m,lastsize,lastlastsize,nowsize;
 8 int last[MAX],lastlast[MAX],now[MAX];
 9 int num[MAX],dp[MAX][MAX],temp[MAX][MAX];//dp[k][i][j]表示第k行选择i方案,第k-1行选择j方案的最大炮兵数
10
11 void dfs(int id,int k,int p,int sum)
12 {
13     if(k>=m)
14     {
15         now[++nowsize]=p;
16         num[nowsize]=sum;
17         return;
18     }
19     dfs(id,k+3,p|(1<<k),sum+1);
20     dfs(id,k+1,p,sum);
21 }
22
23 void DP()
24 {
25     for(int k=1; k<=n; ++k)
26     {
27         memset(now,0,sizeof now);
28         nowsize=0;
29         dfs(k,0,0,0);
30         for(int i=1; i<=nowsize; ++i)for(int j=1; j<=lastsize; ++j)dp[i][j]=0;
31         for(int i=1; i<=nowsize; ++i) //本行选择第几个方案
32         {
33             for(int j=1; j<=lastsize; ++j) //上一行选择第几个方案
34             {
35                 for(int t=1; t<=lastlastsize; ++t) //上上行选择第几个方案
36                 {
37                     if(now[i] & last[j])continue;//与上一行j方案不能共存
38                     if(now[i] & lastlast[t])continue;//与上上行t方案不能共存
39                     if(dp[i][j]<temp[j][t]+num[i])dp[i][j]=temp[j][t]+num[i];
40                 }
41             }
42         }
43         for(int i=1; i<=nowsize; ++i)for(int j=1; j<=lastsize; ++j)temp[i][j]=dp[i][j];
44         for(int i=1; i<=lastsize; ++i)lastlast[i]=last[i];
45         lastlastsize=lastsize;
46         for(int i=1; i<=nowsize; ++i)last[i]=now[i];
47         lastsize=nowsize;
48     }
49 }
50
51 int main()
52 {
53     while(~scanf("%d%d",&n,&m))
54     {
55         last[1]=lastlast[1]=temp[1][1]=0;
56         lastsize=lastlastsize=1;
57         DP();
58         int sum=0,cot;
59         for(int i=1; i<=lastsize; ++i)
60         {
61             for(int j=1; j<=lastlastsize; ++j)
62             {
63                 if(temp[i][j]>sum)
64                 {
65                     sum=temp[i][j];
66                     cot=1;
67                 }
68                 else if(temp[i][j]==sum)
69                     cot++;
70             }
71         }
72         printf("%d %d\n",sum,cot);
73     }
74     return 0;
75 }

转载于:https://www.cnblogs.com/zpfbuaa/p/4991970.html

DP大作战—状态压缩dp相关推荐

  1. 由NP完全问题引出动态规划——状态压缩DP

    " 所有部分都应当在非强制的情况下组合回一起.要记住,你重组的那部分原来就是你拆解的.因此,如果你不能让它们组合回来的话,那一定是有原因的.要想尽一切办法,除了用锤头." – IB ...

  2. 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索

    [AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...

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

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

  4. LeetCode 1799. N 次操作后的最大分数和(回溯 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 错误解 2.2 回溯超时解 2.3 回溯通过 2.4 状态压缩DP 1. 题目 给你 nums ,它是一个大小为 2 * n 的正整数数组. 你必须对这个数组 ...

  5. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  6. [BZOJ4416][Shoi2013]阶乘字符串 状态压缩dp

    诶一直感觉这个数字特别大的时候会无解 然而一直没有把这个数算出来,觉得可能是大于一个数无解小于一个数暴力 然而看题解发现这个数字是2121 正解先特判nn是否大于2121,若大于puts no 否则进 ...

  7. 第 256 场力扣周赛(状态压缩+dp,二进制子序列的动规、940)

    第 256 场力扣周赛 有事没做,来看一下题 5854. 学生分数的最小差值 题目描述 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整 ...

  8. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  9. 第一章 动态规划 状态压缩DP

    1.基本概述 状态压缩dp和状态机一样,都是一种特殊的状态表示方式.状态机用一系列小状态表示某一状态.状态压缩dp用二进制数进行表示.虽然看代码起来时间复杂度比较高,但是很多的情况都给剪枝掉了. 状态 ...

最新文章

  1. 「鸡娃」是家长无处安放的「应试」焦虑
  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
  3. ZOJ - 3591 NIM
  4. 组策略里更改更新和设置客户端首页
  5. uni-app的事件传参
  6. 使用openssh的登录的三种方法
  7. 「代码随想录」337.打家劫舍III 【动态规划】力扣详解!
  8. java mybatis配置,mybatis配置——Java版
  9. iOS手势UIGestureRecognizer的使用及手势冲突的解决办法【转】
  10. 50个Windows软件的免费替代品
  11. 关于前端架构的过去、现在与未来
  12. 纸箱制作机器人邮箱_纸箱机器人衣服制作方法
  13. EXCEL VBA 实现翻译(简单对照)
  14. 代码从svn到工作空间,Myeclipse中java项目转成Web项目
  15. python堆叠面积图_06. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图...
  16. Side-Tuning:domain adaption
  17. Alice和Bob的故事---非对称加密
  18. Acer暗影骑士U盘重装系统教学分享
  19. Python小程序之倒计时
  20. 短线上岸西安电子科技大学考研811信号与电路分析经验分享

热门文章

  1. 戴尔65W笔记本电脑USB TYPE-C适配器接口维修实例
  2. 易基因:植物DNA甲基化专题 |玉米:从群体水平揭示DNA甲基化变异对表型的贡献
  3. python怎么下载pil库_如何在windows下安装Python的PIL库
  4. python cmdb_CMDB管理系统
  5. 科济药业上市首日跌破发行价,基石投资者账面亏损超1亿港元
  6. Python Mosh 学习笔记(6小时完全入门)
  7. 用户数据分析案例学习笔记
  8. Permission Denial: requires android.permission.INTERACT_ACROSS_USERS_FULL
  9. 【大道至简】浅谈自然语言处理(NLP)学习路线(二):N-Gram模型,一文带你理解N-Gram语言模型
  10. 数据库事务、可串行化调度、封锁