题目描述

阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了。现在,零崎要在地图上布置一片阿姆斯特朗回旋加速式阿姆斯特朗炮,那么在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. 使用Html5+C#+微信 开发移动端游戏详细教程 :(一)序(关于作者创业失败的感想)

    说起梦想,我清楚的记得2012年7月初毕业,拿到毕业证书的那天果断买好了次日南下去深圳的绿皮火车票,500多块,26个小时车程.第二天就拖上行李到了深圳. 一开始的想法仅仅是过去想见见世面,学习点新技 ...

  2. Click Models for Web Search(1) - Basic Click Models

    这篇文章主要是介绍一些基本的click model,这些不同的click model对用户与搜索结果页的交互行为进行不同的假设. 为了定义一个model,我们需要描述出observed variabl ...

  3. Guzzle – 构建 RESTful Web 服务的 PHP HTTP 框架

    Guzzle 减轻了发送 HTTP 请求和创建 Web 服务客户端的痛苦.它包含建立一个强大的网络服务客户端的工具,包括:服务描述定义的输入和输出的 API,资源迭代器遍历分页资源,尽可能有效地发送大 ...

  4. Android学习笔记之DocumentBuilder的使用....

    PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容...   XML文件想必大家都非常的熟悉,可扩展的标记语 ...

  5. jQuery--捕获键盘敲击

    功能 当页面加载完成​后,用户键盘按下某个键后,jQuery能够捕获到一个数字,从而执行一系列动作. 格式 1 2 3 4 5 6 7 8 9 10 11 12 $(function(){     $ ...

  6. Redis设计与实现-附加功能

    发布与订阅 redis订阅分为精准的频道订阅与模糊匹配的模式订阅: redis将所有频道的订阅关系都保存在服务器状态pubsub_channels字典里,键是频道名,值是一个记录所有订阅此频道的客户端 ...

  7. [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  8. [Solution] NPOI操作Excel

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

  9. 常用的android弹出对话框

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...

  10. 数学 --- 高斯消元 POJ 1830

    开关问题 Problem's Link: http://poj.org/problem?id=1830 Mean: 略 analyse: 增广矩阵:con[i][j]:若操作j,i的状态改变则con[ ...