게임 DP

게임 DP

문제 여기서 설명 의미

RPG 게임을하는 등의 작은 야옹. 이 게임에서 플레이어는 두 개의 속성, 공격과 방어, 그리고 지금 작은 야옹 공격과 방어가 1입니다을 가지고, 다음 만남은 작은 야옹 N 이벤트 다음됩니다. 두 개의 이벤트가 있습니다.

1. 작은 연습 후 야옹, 업그레이드의 역할, 그리고 당신은 공격을 선택할 수 있습니다 +1또는 방어 +1.

야옹가 적을 발생 야옹 2. 작은, 당신은 싸우거나 도망을 선택할 수 있습니다. 승리 후 전투는 [I] 돈을받을 경우. 당신이 멀리 실행하는 경우에 상관없이 발생하지만, 더 이상이 괴물 경기 돌아올 수 있습니다.

작은 야옹 야옹 이상의 공격이나가 동일하면 전투를 들어, atk[i]보다 크거나 같은 방어, def[i]그는 그가 Daguai을 선택하거나, 그는 자신이 부상을 발견 할 것이다, 따라서 탈출을 선택할 수 있도록, 괴물을 물리 칠 해치지 않을 수 있습니다.

이제 작은 야옹가 이것에 능숙 추가 업그레이드 속성을 선택하여, 알고 그가 할 수 원하는 \ (n \) 얼마나 많은 돈을 하나 개의 이벤트를.

[입력 포맷]

첫 번째 라인 정수 \ (N- \) .

2 ~ N + 1 라인의 각각의 문자 'U'또는 'M'을 갖고, 각각 상기 괴물을 업그레이드 몬스터의 경우, 세 개의 공간 [i]는 정수 A [i]를, 공격에 의해 분리 한 후, DEF [I].

[출력 형식]

가장 돈을 나타내는 정수.

간단한 \ (DP \)

리셋 상태 \ (F는 [I] [J ] \) 나타낸다 (I \) \ 라운드이를 공격한다 (\ J) \ , 및 현재 방위의 접두사로 계산 될 수있다 [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;
}

추천

출처www.cnblogs.com/santiego/p/11824112.html