这是一道完全背包问题,开始我是将大招蓄力后的值都存入w[i],v[i]中来和前三个技能一起进行dp,但不对,后来看了大佬的解释才知道这样做只有数据小的时候才对否则会超时。
因此,我们要将蓄力L秒即w[4] = l,v[4] = temp,和蓄力r秒w[5] = r,v[5] = temp + (r - l) * A与前三个技能放在一起进行dp。
最后再来与dp[T]的从i = L 开始往后的dp[T - i] + temp + (i - L) * A伤害值进行dp取最优值
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1e6 + 6;
ll w[6],v[6],dp[N];
int main()
{
ll T;
while(cin >> T)
{
memset(dp,0,sizeof(dp));
for(int i = 1; i <= 3; i++)
{
cin >> w[i]/*技能释放时间*/ >> v[i];/*技能伤害值*/
}
ll l,r,temp,A;
cin >> l >> r >> temp >> A;
w[4] = l, v[4] = temp;
w[5] = r, v[5] = temp + (r - l) * A;
for(int i = 1; i <= 5; i++)
{
for(int j = w[i] ; j <= T; j++)
{
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
}
}
for(int i = l ; i <= r; i++)
{
dp[T] = max(dp[T],dp[T - i] + temp + (i - l) * A);
}
cout <<dp[T] << endl;
}
return 0;
}