不知为何,小样例都能过,大样例答案错误。民间数据评测也是小数据全过,而最后 6 个点 WA。
求高人帮忙指点下,谢谢!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool s;
int n;
ll a[10005],b[10005],c[10005];
ll dp[2][500005];
bool t;
int main(){
// freopen("variance4.in","r",stdin);
// printf("%.2lf\n",(&t-&s)/1024.0/1024.0);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<n;i++)
b[i]=a[i+1]-a[i];
sort(b+1,b+n);
for(int i=1;i<n;i++)c[i]=c[i-1]+b[i];
int st=1;
while(b[st]==0&&st<n)st++;
if(st==n){
puts("0");
return 0;
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=st,now=1;i<n;i++,now^=1){
memset(dp[now],0x3f,sizeof(dp[now]));
for(int j=0;j<=n*a[n];j++)
if(dp[now^1][j]<0x3f3f3f3f3f3f3f3f){
dp[now][j+c[i]]=min(dp[now][j+c[i]],dp[now^1][j]+c[i]*c[i]);
dp[now][j+i*b[i]]=min(dp[now][j+i*b[i]],dp[now^1][j]+2*b[i]*j+i*b[i]*b[i]);
}
}
ll ans=0x3f3f3f3f3f3f3f3f;
for(int j=0;j<=n*a[n];j++)
if(dp[(n-st)&1][j]<0x3f3f3f3f3f3f3f3f){
ans=min(ans,n*dp[(n-st)&1][j]-j*j);
}
printf("%lld\n",ans);
return 0;
}