每日打卡 还剩99道题
作者:
__NULL__
,
2024-08-09 11:50:46
,
所有人可见
,
阅读 77
#include<bits/stdc++.h>
using namespace std;
const int MAXX = 2e6 + 5;
int n, m, dp[MAXX], a, v, s, q[MAXX], dp1[MAXX];
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
memcpy(dp1, dp, sizeof(dp));
cin >> v >> a >> s;
for(int j = 0; j < v; j++){
int head = 0, t = 0;
for(int k = j; k <= m; k += v){
if(t - head && q[head] < k - v * s){
head++;
}
if(t - head){
dp[k] = max(dp1[k], dp1[q[head]] + (k - q[head]) / v * a);
}
while(t - head && dp1[k] >= dp1[q[t - 1]] + (k - q[t - 1]) / v * a) t--;
q[t++] = k;
}
}
}
cout << dp[m] << '\n';
return 0;
}
哈哈 越打卡发现剩余的越多
呵呵
多重背包问题 III