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