求助50分qwq
查看原帖
求助50分qwq
114975
cxlcxl楼主2020/8/9 15:49
//f[i][j]表示前i种材料,锅里材料共有j种时耐久值
//f[i][j]=max{f[i-1][j-1...j+s-1]}+a[i]*j;
#include<iostream>
#include<cstring>
using namespace std;
int n,w,s,a[5505],q1[5505],head,tail;
long long f[5505][5505],ans;
int main() {
    cin>>n>>w>>s;
    for(int i=1;i<=n;i++) cin>>a[i];
    memset(f,-127,sizeof(f)); 
    f[1][1]=a[1];
    for(int i=2;i<=n;i++) {
    	int j=w<i?w:i;
        tail=0;head=1;q1[++tail]=j;
        for(;j>0;j--) {
            while(f[i-1][j-1]>f[i-1][q1[tail]]&&tail>=head) tail--;
            q1[++tail]=j-1;
            while(q1[head]-q1[tail]>s&&head<=tail) head++;
            f[i][j]=f[i-1][q1[head]]+a[i]*j;
        }
    }
    ans=f[n][1];
    for(int i=2;i<=w;i++) ans=max(ans,f[n][i]);
    cout<<ans<<endl;
    return 0;
}
2020/8/9 15:49
加载中...