动态规划的优化2

作业介绍

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e4+5;
int n,L;
int a[N],sum[N];
int f[N],q[N],tail=-1,head=0;
int A(int i){
	return sum[i]+i;
}
int B(int i){
	return sum[i]+i+L+1;
}
int X(int i){
	return B(i);
}
int Y(int i){
	return f[i]+B(i)*B(i);
}
double slope(int i,int j){
	return double(Y(i)-Y(j))/double(X(i)-X(j));
}
signed main(){
	cin>>n>>L;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	/*
	f[i] = f[j]+(A[i]-B[j])^2
	*/
	q[++tail] = 0;
	for(int i=1;i<=n;i++){
		while(tail>head && slope(q[head],q[head+1])<=2*A(i))head++;
		int j = q[head];
		f[i] = f[j]+(A(i)-B(j))*(A(i)-B(j));
		while(tail>head && slope(i,q[tail-1])<=slope(q[tail],q[tail-1]))tail--;
		q[++tail] = i;
	}
	cout<<f[n]<<endl;
	return 0;
}
/*
 * f[i] = f[j] + A*(sum[i]-sum[j])^2 + B*(sum[i]-sum[j]) + C
 * f[i] = f[j] + A*sum[i]^2 - 2A*sum[i]*sum[j]+Asum[j]^2+ B*sum[i] -B*sum[j] +C
 * f[i]-B*sum[i]-A*sum[i]^2 = - 2A*sum[i]*sum[j] +A*sum[j]^2 - B*sum[j] +C+f[j]
 * X(i) = sum[i]
 * K(i) = -2A*sum[i]
 * Y(i) = f[i]-B*sum[i]+A*sum[i]^2
 */
#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
ll sum[1000005],q[1000005],f[10000005];
int n,a,b,c;
ll X(int x)
{
    return sum[x];
}
ll Y(int x)
{
    return f[x]-b*sum[x]+a*sum[x]*sum[x];
}
double k(int a,int b)
{
    return double((Y(b)-Y(a))/(X(b)-X(a)));
}

int main()
{
    cin>>n>>a>>b>>c;
    for(int i=1;i<=n;i++){
        cin>>sum[i];
        sum[i]+=sum[i-1];
    }
    int tail = 0,head = 0;
    for(int i=1;i<=n;i++){
        while(tail>head && k(q[head],q[head+1])>2*a*sum[i])head++;
        int j = q[head];
        f[i] = f[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c;
        while(tail>head && k(q[tail],q[tail-1])<k(q[tail],i))tail--;
        q[++tail] = i;
    }
    cout<<f[n]<<endl;
    return 0;
}
状态
已结束
题目
6
开始时间
2026-4-25 0:00
截止时间
2026-5-3 23:59
可延期
24 小时