游戏 DP

游戏 DP

【题意描述】

小喵喵喜欢玩 RPG 游戏。在这款游戏中,玩家有两个属性,攻击和防御,现在小喵喵的攻击和防御都是 1,接下来小喵喵会依次遇到 n 个事件。事件有两种。

1.小喵喵经过修炼,角色升级了,此时可以选择攻击+1 或者防御+1.

2.小喵喵遇到了一个敌人,可以选择战斗或者逃跑。如果战斗, 胜利后得到 a[i]金钱。如果逃跑,则无事发生,但是以后也不能再 回来打这个怪物了。

对于一场战斗来说,如果小喵喵的攻击力大于等于 atk[i],防御 力大于等于 def[i],那么他可以无伤打败这只怪物,从而他选择打怪,否则他发现自己会受伤,从而选择逃跑。

现在小喵喵想知道,通过巧妙地选择升级时加的属性,他最多能 够从这\(n\)个事件中获得多少金钱。

【输入格式】

第1行一个整数\(n\)。

第 2~n+1 行每行会有一个字符’U’或’M’,分别表示升级和怪物, 如果是怪物,之后有空格隔开的三个整数 a[i],atk[i],def[i]。

【输出格式】

一个整数,表示最多的金钱。

简单\(DP\)

设状态\(f[i][j]\)表示第\(i\)轮,现在攻击力为\(j\),用一个前缀和可以算出当前防御力为\(sum[i]-j\),按题意转移即可。

考试时,觉得初始攻击防御很烦,其实是读漏题了,就把所有怪物都减了1,小喵喵初始为0

#include <cstdio>
#include <algorithm>
#define MAX(A,B) ((A)>(B)?(A):(B))
#define ll long long
using namespace std;
inline int read(){
    char ch=getchar();int s=0;
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') s=s*10+(ch^'0'), ch=getchar();
    return s;
}
#define MAXN 2019
int n;
bool hav[MAXN];
int atk[MAXN],def[MAXN],a[MAXN];
int sum[MAXN];
ll f[MAXN][MAXN];
int main(){
    n=read();
    for(int i=1;i<=n;++i){
        char opt=getchar();
        while(opt!='U'&&opt!='M') opt=getchar();
        sum[i]=sum[i-1];
        if(opt=='U'){
            ++sum[i];
        }else if(opt=='M'){
            hav[i]=1;
            a[i]=read(),atk[i]=read(),def[i]=read();
            --atk[i];
            --def[i];
        }else puts("ERROR");
    }
    for(register int i=1;i<=n;++i)
    for(register int j=0;j<=sum[i];++j){ // a
        int k=sum[i]-j;
        f[i][j]=f[i-1][j];
        if(!hav[i]){
            if(j>=1)
                f[i][j]=max(f[i-1][j-1], f[i][j]);
            f[i][j]=max(f[i-1][j], f[i][j]);
        }
        if(hav[i]&&j>=atk[i]&&k>=def[i]) f[i][j]+=(ll)a[i];
    }
    ll ans=0;
    for(register int j=0;j<=sum[n];++j) ans=max(ans, f[n][j]);
    printf("%lld", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/santiego/p/11824112.html

时间: 2024-08-01 18:06:55

游戏 DP的相关文章

[LuoguP1005]矩阵取数游戏 (DP+高精度)

题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来挺OK的 实则并不OK 反例: 3 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 如果贪心的话,我们会优先把右边那一串2先选了,再去选3和1 但是正确答案显然是先把3和1选了,再去选那一串2 既然贪心不成,我们可以考虑一下DP 然后我们考虑这样一个状态: f[i][j][k] 表示第i

Luogu P1057 传球游戏(dp 递推)

P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视

vijos 1464 积木游戏 DP

描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,…,N的长方体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边"和"c边" 游戏规则如下:1.从N块积木中选出若干块,并将它们分成M(l<=M<=N) 堆,称为第1堆,第2 堆…,第M堆.每堆至少有1块积木,并且第K堆中任意一块积木的编号要大于第K+1堆中任意一块积木的编号(2<=K<=M). 2.对于每一堆积木,游戏者要

codevs 1085 数字游戏 dp或者暴搜

1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2):

FZU2126:消除类游戏(DP)

Problem Description S近期在玩一种游戏. 这样的游戏的规则是一个一个地往一个栈里放有颜色的球,当栈顶连续k个球颜色同样时.这k个球立马同一时候消失. 如今S已经往栈里放了n个球,他想知道再放m个球,然后使得栈里的球都被消去的放法有多少种.两种放法不同是指存在放的第i个球这两种放法放的球的颜色不同.因为方法数可能非常多,将答案mod 1000000007.  Input 输入包括多组数据.输入数据的第一行为四个整数n,m,h,k(0<=n,m,h<=1000,2<=k&

【BZOJ3191】【JLOI2013】卡牌游戏 [DP]

卡牌游戏 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏.然后卡片将会被放回卡牌堆里并重新洗牌.被处决的人按顺时针的下一个

【BZOJ1915】[Usaco2010 Open]奶牛的跳格子游戏 DP+单调队列

[BZOJ1915][Usaco2010 Open]奶牛的跳格子游戏 Description 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N.就像任何一个好游戏一样,这样的跳格子游戏也有奖励!第i个格子标有一个数字V_i(-2,000,000,000 <=V_i <= 2,000,000,000)表示这个格子的钱.奶牛们想看看最后谁能得到最多的钱.规则很简单: * 每个奶牛从0号格子出发

bzoj1025: [SCOI2009]游戏(DP)

题目大意:将长度为n的排列作为1,2,3,...,n的置换,有可能置换x次之后,序列又回到了1,2,3,...,n,求所有可能的x的个数. 看见这种一脸懵逼的题第一要务当然是简化题意...我们可以发现,序列回到原状的次数就是每个循环的规模(即在循环中的数字个数)的lcm,而且因为有n个数,显然所有循环的规模之和就是n,那么问题就被简化成了a1+a2+a3+...+ak=n,求lcm(a1,a2,a3,...,an)的个数. 现在题意已经清楚多了,那咋写呢QAQ 我们把一个数分解质因数,p为质数,

bzoj 1025 [SCOI2009]游戏 dp

题面 题目传送门 解法 显然,可以回到初始状态就意味着一定由若干个环组成 假设环的长度为\(l_i\) 那么,我们可以得到\(\sum l_i=n\) 不考虑自环的情况,那么\(\sum l_i≤n\) 将\(n\)以内的质因数全部筛出,强制每一次只取某一个质数的次幂,那么就可以解决重复计数的问题 时间复杂度:\(O(n^2)\) 代码 #include <bits/stdc++.h> #define int long long #define N 1010 using namespace s