게임 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;
}