[BZOJ 2964] Boss单挑战
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单挑战的更多相关文章
- Codevs 2006=BZOJ 2964 Boss单挑战
2964: Boss单挑战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 266 Solved: 120[Submit][Status][Discu ...
- [BZOJ2964]Boss单挑战
题目描述 某\(RPG\)游戏中,最后一战是主角单挑\(Boss\),将其简化后如下: 主角的气血值上限为\(HP\),魔法值上限为\(MP\),愤怒值上限为\(SP\):\(Boss\)仅有气血值, ...
- bzoj P4825 [Hnoi2017]单旋——solution
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...
- BZOJ:4825: [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋 [lct]
4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...
- 【刷题】BZOJ 4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋【dfs序+线段树+hash】
这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 浅谈游戏中BOSS设计的思路
对于大多数游戏来说,BOSS在其设计上都有着不可替代的作用,也是玩家印象最为深刻的一部分.近期自己也有在做BOSS的设计工作,有一些心得想要分享一下: 1.明确BOSS的设计目的 在设计之初,我们一定 ...
随机推荐
- webkit在vs2008中编译
转载自:http://xjchilli.blog.163.com/blog/static/4534773920091016115533158/ webkit的官方网站写的webkit需要在vs2005 ...
- javascript简易下拉菜单效果
JS代码: window.onload=function(){ var oDiv=document.getElementById('navMenu'); var aUl=oDiv.getElement ...
- jsp分页完善版
明天要考网络工程师了,而且这两天校运会,把那个分页的完善了下,明天考试,祈祷吧,我根本都没看书啊,所以只能去长见识了.100大洋啊,下个学期我想考考证了,不然以后出去麻烦了.呵呵,不多说还是说说自己对 ...
- 拉格朗日乘数法 和 KTT条件
预备知识 令 \(X\) 表示一个变量组(向量) \((x_1, x_2, \cdots, x_n)\) 考虑一个处处可导的函数 \(f(X)\), 为了方便描述, 这里以二元函数为例 对于微分, 考 ...
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- [bzoj2251][2010Beijing Wc]外星联络——后缀数组+暴力求解
Brief Description 找到 01 串中所有重复出现次数大于 1 的子串.并按字典序输出他们的出现次数. Algorithm Design 求出后缀数组之后,枚举每一个后缀,对于每个后缀从 ...
- 安全测试===Mysql 注入技巧学习 MySQL注入技巧(2)
原文地址:http://websec.files.wordpress.com/2010/11/sqli2.pdf 0x00.介绍 也可以参考瞌腄龙的mysql注入科普:http://drops.woo ...
- Mac-安装itellij idea
1.安装解压 Unzip and copy JetbrainsCrack.jar to /Applications/CLion.app/Contents/bin/JetbrainsCrack.jar ...
- 2.jinja2
1.jinja2模板介绍和查找路径 from flask import Flask, render_template import os # 之前提到过在渲染模板的时候,默认会从项目根目录下的temp ...
- MATLAB二维插值和三维插值
插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...