小明打聯盟
網址鏈接:牛客網
題目大意
- 有三個基本技能施法時間x,y,z,其傷害分別爲a,b,c
- 有一個大招施法時間爲L,可以釋放的時間爲[L,R],這個區間,其傷害爲 temp + A * i (i爲從L開始的蓄力時間)
- 求T時間內最大連招傷害
解題思路
可以考慮使用揹包DP思路,將大招L,R的時間點看成兩個獨立的技能,L的傷害爲temp,R的傷害爲temp+(R-L)*A。最後在dp結果求一遍大招最大傷害,求得最優解。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep2(i,st,ed) for(int i = st; i < ed; ++i)
#define mk(x,y) make_pair(x,y)
#define pb(x) push_back(x)
const ll mod = 1e9 + 7;
const ll N = 2e5 + 200;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
int w[N], v[N];
ll dp[N];
int main(){
int t;
while(cin>>t){
memset(dp, 0, sizeof(dp));
rep(i,3){
cin>>w[i]>>v[i];
}
ll L,R,temp, A;
cin>>L>>R>>temp>>A;
w[3] = L;
v[3] = temp;
w[4] = R;
v[4] = temp + (R-L)*A;
rep(i,5){
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;
}