题目描述

阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了。现在,零崎要在地图上布置一片阿姆斯特朗回旋加速式阿姆斯特朗炮,那么在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】

给出本题代码:

 #include <bits/stdc++.h>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=+;
int n,m,lastsize,lastlastsize,nowsize;
int last[MAX],lastlast[MAX],now[MAX];
int num[MAX],dp[MAX][MAX],temp[MAX][MAX];//dp[k][i][j]表示第k行选择i方案,第k-1行选择j方案的最大炮兵数 void dfs(int id,int k,int p,int sum)
{
if(k>=m)
{
now[++nowsize]=p;
num[nowsize]=sum;
return;
}
dfs(id,k+,p|(<<k),sum+);
dfs(id,k+,p,sum);
} void DP()
{
for(int k=; k<=n; ++k)
{
memset(now,,sizeof now);
nowsize=;
dfs(k,,,);
for(int i=; i<=nowsize; ++i)for(int j=; j<=lastsize; ++j)dp[i][j]=;
for(int i=; i<=nowsize; ++i) //本行选择第几个方案
{
for(int j=; j<=lastsize; ++j) //上一行选择第几个方案
{
for(int t=; t<=lastlastsize; ++t) //上上行选择第几个方案
{
if(now[i] & last[j])continue;//与上一行j方案不能共存
if(now[i] & lastlast[t])continue;//与上上行t方案不能共存
if(dp[i][j]<temp[j][t]+num[i])dp[i][j]=temp[j][t]+num[i];
}
}
}
for(int i=; i<=nowsize; ++i)for(int j=; j<=lastsize; ++j)temp[i][j]=dp[i][j];
for(int i=; i<=lastsize; ++i)lastlast[i]=last[i];
lastlastsize=lastsize;
for(int i=; i<=nowsize; ++i)last[i]=now[i];
lastsize=nowsize;
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
last[]=lastlast[]=temp[][]=;
lastsize=lastlastsize=;
DP();
int sum=,cot;
for(int i=; i<=lastsize; ++i)
{
for(int j=; j<=lastlastsize; ++j)
{
if(temp[i][j]>sum)
{
sum=temp[i][j];
cot=;
}
else if(temp[i][j]==sum)
cot++;
}
}
printf("%d %d\n",sum,cot);
}
return ;
}

DP大作战—状态压缩dp的更多相关文章

  1. Marriage Ceremonies(状态压缩dp)

     Marriage Ceremonies Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  2. HDU2167+状态压缩DP

    状态压缩dp 详见代码 /* 状态压缩dp dp[ i ][ j ]:第i行j状态的最大和 dp[i][j] = max( dp[i-1][k]+sum[i][j] ); 题意:给定一个N*N的方格, ...

  3. 学习笔记:状态压缩DP

    我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态.但是有这样的一些题 目,它们具有DP问题的特性,但是状态中所包含的信息过多,如果要用数组来保存状态的话需要 ...

  4. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  5. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  6. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  7. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  8. POJ 1185 (状态压缩DP)

    中文题目,题意就不说了. 不得不说这是一道十分经典的状态压缩DP的题目. 思路: 通过分析可以发现,第i行的格子能不能放大炮仅与第i-1和i-2行的放法有关,而与前面的放法无关,因此,如果我们知道了i ...

  9. poj 3311 Hie with the Pie(状态压缩dp)

    Description The Pizazz Pizzeria prides itself or more (up to ) orders to be processed before he star ...

随机推荐

  1. Laravel 5 多个视图共享数据的方法

    我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php 为了简单一点,文件里只有设置了一个变量 {{ ...

  2. SQL Server里简单参数化的痛苦

    在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用.首先 ...

  3. python之异常处理

    异常处理是高级编程语言必备的一个功能模块. 一.异常基础 在编程过程中为了增加友好性.容错性和健壮性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大 ...

  4. python编码问题的最终分析

    python初学者,往往因为字符编码的问题而苦恼不已,本人也是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果.下面一段代码是在python3.5上的,以它为例进行讲解(请忽略糟糕 ...

  5. JS数组追加数组采用push.apply的坑

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...

  6. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  7. struts2基础——标签

    一.通用标签 1.s:property (读取值栈中对象的属性值) 属性:value:指定OGNL表达式:default:OGNL表达式返回为 null 时,使用默认值:escape:是否对 HTML ...

  8. Unity3D入门基本概念整理

    1. (1)在场景中添加资源 只需单击工程视图 (Project View) 中的网格(Mesh)并拖动至层级视图 (Hierarchy) 或场景视图 (Scene View),便可将其添加至场景 ( ...

  9. jquery实现表格内容筛选

    对于表格来说,当数据比较多的时候,我们无法一页一页的查找,这时可以通过一个搜索框来实现搜索. 对于这个搜素框,我们为了更好的体验可以利用keyup事件实现在用户输入的时候就开始筛选,而不是填完以后点击 ...

  10. 百度地图js根据经纬度定位和拖动定位点

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...