思路

每个技能可以放无限次,并且有时间限制和伤害数值,我们想到完全背包模型。但是最后一个技能有多种情况,我们考虑如何转化。本题一个坑点,有多组测试数据!!!

1、我们可以把最后一个技能斤进行转化,转化为几个普通的技能。每个技能的时间为:t = l + i;伤害为:tmp + A * i;其中i为蓄力的时间。

2、由于题目给的数据范围比较大1e5,我们考虑用优化版的完全背包,转移方程为:f[i][j] = max(f[i - 1][j], f[i][j - t[i]] + w[i])

3、空间也要优化:f[j] = max(f[j], f[j - t[i]] + w[i])

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N = 1e5 + 10;
typedef long long LL;
LL f[N];
LL t[N], w[N];
int main()
{
    int T;
    while(cin >> T)
    {
        memset(f, 0, sizeof f);
        for(int i = 1; i <= 3; i ++)
        {
            cin >> t[i] >> w[i];
        }
        LL l, r, tmp, aa;
        cin >> l >> r >> tmp >> aa;
        for(int i = 0; i <= r - l; i ++)
        {
            t[i + 4] = l + i;
            w[i + 4] = tmp + aa * i;
        }
        int n = 4 + r - l;
        for(int i = 1; i <= n; i ++)
        {
            for(int j = t[i]; j <= T; j ++)
            {
                f[j] = max(f[j], f[j - t[i]] + w[i]);
            }
        }
        cout << f[T] << endl;
    }

    return 0;
}