Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964

Algorithm:

一道很新颖的背包问题

此题每个状态要维护的量巨多,而转移方式也巨多,直接写转移方程明显是不现实的

那要考虑的就是能否将这些量分开考虑,它们间是否有明确的约束关系

可以发现mp和sp的相关操作和在哪一个回合无关,而只与需要的回合总数有关

那么就先DP出fm[i]和fs[i],分别表示用i个回合能用mp与sp打出的最大伤害,可以算出最少要mneed个回合战胜boss

接下来再逐个回合考虑hp问题,用dp[i][j]表示到第i个回合血量为j时能挤出的最大回合数

能挤出mneed个回合则YES,能在第n回合保持不死则输出Tie,否则NO

Code:

#include <bits/stdc++.h>

using namespace std;

const int MAXN=+;
const int INF=<<; int T,n,m,x,hp,mp,sp,mp_cnt,sp_cnt,dhp,dsp,dmp;
int a[MAXN],ump[MAXN],amp[MAXN],usp[MAXN],asp[MAXN];
int fm[MAXN],gm[MAXN][MAXN],fs[MAXN],gs[MAXN][MAXN],dp[MAXN][MAXN]; void up(int &x,int y){if(x<y) x=y;} void solve()
{
memset(fm,,sizeof(fm));memset(gm,,sizeof(gm));
memset(fs,,sizeof(fs));memset(gs,,sizeof(gs)); cin>>n>>m>>hp>>mp>>sp>>dhp>>dmp>>dsp>>x;
for(int i=;i<=n;i++) cin >> a[i];
cin >> mp_cnt;
for(int i=;i<=mp_cnt;i++) cin >> ump[i] >> amp[i];
cin >> sp_cnt;
for(int i=;i<=sp_cnt;i++) cin >> usp[i] >> asp[i]; for(int i=;i<=n;i++)
{
for(int j=;j<=mp;j++) up(fm[i],gm[i][j]);
if(i==n) break;
for(int j=;j<=mp;j++)
{
up(gm[i+][min(mp,j+dmp)],gm[i][j]);
for(int k=;k<=mp_cnt;k++)
if(j>=ump[k]) up(gm[i+][j-ump[k]],gm[i][j]+amp[k]);
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=sp;j++) up(fs[i],gs[i][j]);
if(i==n) break;
for(int j=;j<=sp;j++)
{
up(gs[i+][min(sp,j+dsp)],gs[i][j]+x);
for(int k=;k<=sp_cnt;k++)
if(j>=usp[k]) up(gs[i+][j-usp[k]],gs[i][j]+asp[k]);
}
} int mneed=INF;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(fm[i]+fs[j]>=m) mneed=min(mneed,i+j); for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)
dp[i][j]=-INF; dp[][hp]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=hp;j++)
if(dp[i][j]>=mneed)
{
cout << "Yes " << i << endl;
return;
}
for(int j=;j<=hp;j++)
{
if(min(hp,j+dhp)>a[i]) up(dp[i+][min(hp,j+dhp)-a[i]],dp[i][j]);
if(j-a[i]>) up(dp[i+][j-a[i]],dp[i][j]+);
}
} for(int i=;i<=hp;i++)
if(dp[n+][i]>=)
{
cout << "Tie" << endl;
return;
}
cout << "No" << endl;
} int main()
{
cin >> T;
while(T--) solve();
return ;
}

Review:

发现转移状态时要维护的信息过多时,可以查看这些量是否可以分离

先逐个转移,最后再根据较弱的约束将状态加合

注意大小写啊!!

[BZOJ 2964] Boss单挑战的更多相关文章

  1. Codevs 2006=BZOJ 2964 Boss单挑战

    2964: Boss单挑战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 266  Solved: 120[Submit][Status][Discu ...

  2. [BZOJ2964]Boss单挑战

    题目描述 某\(RPG\)游戏中,最后一战是主角单挑\(Boss\),将其简化后如下: 主角的气血值上限为\(HP\),魔法值上限为\(MP\),愤怒值上限为\(SP\):\(Boss\)仅有气血值, ...

  3. bzoj P4825 [Hnoi2017]单旋——solution

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...

  4. BZOJ:4825: [Hnoi2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...

  5. bzoj 4825: [Hnoi2017]单旋 [lct]

    4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...

  6. 【刷题】BZOJ 4825 [Hnoi2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...

  7. bzoj 4825: [Hnoi2017]单旋【dfs序+线段树+hash】

    这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 浅谈游戏中BOSS设计的思路

    对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...

随机推荐

  1. java基础知识(二)-----多态和构造函数

    一:前言 最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把java基础给搞一遍,真的觉得自己好菜.每天看一点,那个家伙说<java编程思想>最少要看三遍, ...

  2. 【Foreign】Research Rover [DP]

    Research Rover Time Limit: 25 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample ...

  3. 「6月雅礼集训 2017 Day1」说无可说

    [题目大意] 给出n个字符串,求有多少组字符串之间编辑距离为1~8. n<=200,∑|S| <= 10^6 [题解] 首先找编辑距离有一个n^2的dp,由于发现只找小于等于8的,所以搜旁 ...

  4. apache工作模式

    查看当前apache的工作模式 apachectl -l prefork模式 <IfModule prefork.c>StartServers 5MinSpareServers 5MaxS ...

  5. DotNETCore 学习笔记 配置

    Configuration var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(); var config ...

  6. KM算法讲解

    对于二分图,我们可以用匈牙利来求出来最大匹配,但是如果给定每条边一个权值,我们要求这张图的最大匹配最大(小)权,单纯的用匈牙利就没法解决了,当然用费用流也可以做,但是代码较长,在处理完全二分图的时候时 ...

  7. kickstart构建Live CD 添加文件问题

    在构建自定义ISO的时候,有时候需要从母体机器拷贝文件到Live CD系统.比如拷贝/home/xiaoxiaoleo/hello 程序,在Kickstart配置文件里, post脚本添加--noch ...

  8. CentOS 7 主机加固手册-下

      CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x1f 删除禁用非必要的服务 删除非必要的服务 # Remove yum remove ...

  9. 用python写爬虫笔记(一)

    https://bitbucket.org/wswp/code   http://example.webscraping.com http://www.w3schools.com selenium.g ...

  10. 最新Python异步编程详解

    我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的 ...