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. 如何配置开源中国Maven库以加快依赖包下载速度

    有时有某些地方由于网络问题,访问maven主仓库比较慢,甚至有可能无法下载某些jar包,此时可以把开源中国Maven库配置到settings.xml文件中,加快依赖包的下载速度. 具体如何配置? 在m ...

  2. Spring源码解析-实例化bean对象

    spring加载配置文件,AbstractApplicationContext类中的refresh方法起着重要的作用. @Override public void refresh() throws B ...

  3. 小K的农场

    小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...

  4. POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...

  5. rsync 同步

    1./usr/bin/rsync -vzrtopg --progress  --include "weibo-service-server" --exclude "/*& ...

  6. jquery学习总计

    1,jquery的基础语法 $(selector).action(); 选择器(selector)查询和查找html元素,action()执行对函数的操作. 2.选择器 id,类,类型,属性,属性值等 ...

  7. 我之理解---计时器setTimeout 和clearTimeout

    今天在写个图片切换的问题 有动画滞后的问题,才动手去查setTimeout 和clearTimeout.之前写的图片播放器也有类似的问题,有自动start按钮 和stop按钮, 其他都正常,问题出在每 ...

  8. 51nod 1060 最复杂的数

    把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数.   例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等,输出最 ...

  9. bzoj3779: 重组病毒 link-cut-tree

    题目传送门 这道题看了做了个神转换.....推荐个博客给各位大爷看看吧神犇传送门 代码敲了半天....题目也读了半天 线段树维护的东西很容易和lct混在一起 调了调能过也是很开心啊 运气比较好吧233 ...

  10. 【BZOJ】1596: [Usaco2008 Jan]电话网络

    [算法]树上贪心 [题解] 因为一个点必须被覆盖,那么它如果没有被子树节点覆盖的话,就覆盖它的父节点. 从叶子开始贪心. 注意,如果它自己已经被选了就不需要选父节点了. #include<cst ...