题目大意:

有个特工要执行任务,他会遭遇到最多15个目标,特工必须把他们全部杀死。当他杀死一个目标后他可以使用目标的武器来杀死其他人。因此他必须有一个杀人的顺序,使得他开枪的次数最小。
现在给你一个表,代表每种武器对每个目标可以造成多少伤害。并且你知道每个目标的血量。当这个目标的血量小于等于0的时候说明这个目标被杀死了。最初的时候这个特工只有一个枪,这个枪可以对一个目标造成1点伤害。
题目分析: 先把每个状态下最敌人造成的伤害预处理出来,然后再进行一次记忆化搜索。
 
===========================================================================================
 
 
 
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF = 1e9+;
const int MAXN = ;
int dp[MAXN], Att[MAXN][];
int HP[], M[][], n, Lim;
int DFS(int sta)
{
if(dp[sta] != -)
return dp[sta];
if(sta == )
return dp[] = ;
dp[sta] = INF;
for(int i=; i<n; i++)
{
if( sta&(<<i) )
{
int newSta = sta - (<<i);
int k = (HP[i] + Att[newSta][i] - )/Att[newSta][i];
dp[sta] = min(dp[sta], k + DFS(newSta));
}
}
return dp[sta];
} int main()
{
int T, cas = ;
char str[];
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
memset(dp, -, sizeof(dp));
memset(Att, , sizeof(Att));
for(int i=; i<n; i++)
{
scanf("%d", &HP[i]);
Att[][i] = ;
}
for(int i=; i<n; i++)
{
scanf("%s", str);
for(int j=; j<n; j++)
M[i][j] = str[j] - '';
}
Lim = (<<n) - ;
/**把所有的攻击力状态预处理出来*/
for(int i=; i<=Lim; i++)///
for(int j=; j<n; j++)///
{
if( (i&(<<j)) )
{
int newSta = i - (<<j);
for(int k=; k<n; k++)
Att[i][k] = max(Att[newSta][k], M[j][k]);
}
}
printf("Case %d: %d\n",cas ++, DFS(Lim) );
}
return ;
}
 
 
                                                                                                                                                                                                                                                           

Light OJ 1037 - Agent 47(预处理状态压缩DP)的更多相关文章

  1. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  2. lightoj 1037 - Agent 47(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1037 #include <iostream> #include & ...

  3. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  4. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  5. BZOJ 1087状态压缩DP

    状态压缩DP真心不会写,参考了别人的写法. 先预处理出合理状态, 我们用二进制表示可以放棋子的状态,DP[I][J][K]:表示现在处理到第I行,J:表示第I行的状态,K表示现在为止一共放的棋子数量. ...

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

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

  7. HDU2167+状态压缩DP

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

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

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  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. C#/.net七牛云存储上传图片(文件)操作

    七牛云存储官方: C#SDK(http://developer.qiniu.com/docs/v6/sdk/csharp-sdk.html) 注册成为标准用户就可获得:10GB永久免费存储空间/ 每月 ...

  2. Android-关于屏幕适配的一些经验

    刚开始,我开发时选取的模拟器是WVGA854,其分辨率为854*480.我开发完毕后装在800*480的手机上时感觉很OK,但是装到480*320.以及320*240分辨率上的手机时,很多界面都变形了 ...

  3. 总结如何实现Android浮动层,主要是dialog的使用

    自定义一个类继承自Dialog类,然后在构造方法中,定义这个dialog的布局和一些初始化信息. 查看源码打印? 01 public class MenuDialog extends Dialog { ...

  4. window.resizeTo()和window.open()

    函数:window.resizeTo(width, height) 作用:改变窗口大小到设定的宽和高 参数:width - 宽度像素,必须设定的参数           height - 高度像素,可 ...

  5. 多线程、Socket

      多线程 线程.进程和应用程序域 进程:进程是一个操作系统上的概念,用来实现多任务并发执行,是资源分配的最小单元,各个进程是相互独立的,可以理解为执行当中的程序,在操作系统中一般用一个称为PCB的结 ...

  6. .NET设计模式(9):桥接模式(Bridge Pattern)

      .NET设计模式(9):桥接模式(Bridge Pattern)   桥接模式(Bridge Pattern) --.NET设计模式系列之九 年月 实现代码如下:..所谓抽象和实现沿着各自维度的变 ...

  7. Android 设计随便说说之简单实践(合理组合)

    上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...

  8. .Net下的进程间的通讯 -- Windows消息队列

    Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...

  9. iOS,长按图片保存实现方法,轻松搞定!

    1.添加手势识别: UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@s ...

  10. WF学习笔记(三)

    Collection 集合 -AddtoCollection<T> 添加项到集合 :[AddtoCollection]可以将一个项添加到[Collection]集合中 ,[Item]属性用 ...