2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing

题目来源:click
题意:A是你的目前的攻击力,D代表每回合开始时对A的增量,初始化的A与D都为0。
每次都有三种操作可选择。
1.攻击造成A+a[i]伤害。
2.不攻击但使D增加b[i]。
3.不攻击但使A增加c[i]。
问最大伤害。

一开始能看出来是一个dp的题目,但是要如何去表示状态,正向的话每次操作都有三种状态,而且对A D 都会变化,由于a[i],b[i],c[i]的范围都很大,数组没办法去存储。但是我们可以发现只有选择1是对怪物进行了攻击,其他的两个操作都是对A进行提升。可以从攻击次数入手这个状态是完全可以表示的顶多攻击100次。而且最后一次的选择一定是攻击,正好可以从逆序入手,而且A初始也是为0的。
选择1:直接加上a[i]
选择2:那么如果第j(j>i)个回合攻击了的话 j-ib[i]
选择3:i以后的攻击总数k
c[i]
但是选择2我们需要知道是哪几个回合进行了攻击,[(j1+j2+…jn)-k*i]*b[i]即为造成的伤害。可以把(j1+j2+…jn)当作状态因为1-100下标最多也就5050。
那么可以写出的状态转移式子dp[i][j][k]表示第i次操作i之后攻击了j次 j次攻击的下标总和为k。
因为只需要dp[i][][]与dp[i+1][][],这里还可以使用滚动数组进行优化节约空间。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<map>
#include<algorithm>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long  ll;
ll a[110],b[110],c[110];
/*
如果是第一种情况:
那么+a[i]
第二种情况
那么 (sum-i*j)*b[i]
第三种情况
那么j*c[i]
*/
ll dp[2][110][6000];// i:当前的回合 j:该回合后攻击的次数 k:之后攻击的下标总和
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,i,j,k;
        memset(dp,0,sizeof(dp));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
           cin>>a[i]>>b[i]>>c[i];
        dp[n%2][1][n]=a[n];
        for(i=n-1;i>=1;i--)//倒推回合
        {
            for(j=n-i;j>=1;j--)//该回合后的攻击次数
            {
                ll MAX=(n+n-j+1)*j/2;
                for(k=n;k<=MAX;k++)
                {
                    dp[i%2][j+1][k+i]=max(dp[(i+1)%2][j][k]+a[i],dp[i%2][j+1][k+i]);
                    dp[i%2][j][k]=max(dp[i%2][j][k],dp[(i+1)%2][j][k]+(k-j*i)*b[i]);
                    dp[i%2][j][k]=max(dp[i%2][j][k],dp[(i+1)%2][j][k]+j*c[i]);
                }
            }
            memset(dp[(i+1)%2],0,sizeof(dp[(i+1)%2]));
        }
        ll ans=0;
        for(i=1;i<=n;i++)
			for(j=1;j<=5050;j++)
				ans=max(ans,dp[1][i][j]);
				printf("%lld\n",ans);
    }
    return 0;
}
发布了72 篇原创文章 · 获赞 19 · 访问量 7509

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/104124990