Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32045 | 22fhq | 【S】T2 | C++ | 运行超时 | 50 | 1000 MS | 83072 KB | 1518 | 2024-08-30 15:09:31 |
#include<bits/stdc++.h> #define int long long using namespace std; int n,c,a[100005],dp[100005][105],mx; void read(int &x){ x=0; bool f=0; char c=getchar(); while(!isdigit(c)){ if(c=='-')f=1; c=getchar(); } while(isdigit(c)){ x=x*10+c-'0'; c=getchar(); } if(f)x=-x; return; } signed main(){ //freopen("seq.in","r",stdin); //freopen("seq.out","w",stdout); read(n),read(c); memset(dp,0x7f,sizeof(dp)); for(int i=1;i<=n;i++){ read(a[i]); mx=max(mx,a[i]); } // cout<<dp[0][0]<<" "; dp[0][0]=0; for(int i=1;i<n;i++){ dp[0][0]+=abs(a[i]-a[i+1]); } dp[0][0]*=c; // cout<<dp[0][0]<<" "; for(int i=1;i<=n;i++){ for(int j=0;j+a[i]<=mx;j++){ for(int k=0;k+a[i-1]<=mx;k++){ if(i==1&&k>=1)break; if(i!=n&&i!=1) dp[i][j]=min(dp[i][j],dp[i-1][k]+j*j-c*abs(a[i]-a[i-1]-k)+c*abs(a[i]+j-a[i-1]-k)-c*abs(a[i]-a[i+1])+c*abs(a[i]+j-a[i+1])); else if(i==n) dp[i][j]=min(dp[i][j],dp[i-1][k]+j*j-c*abs(a[i]-a[i-1]-k)+c*abs(a[i]+j-a[i-1]-k)); else dp[i][j]=min(dp[i][j],dp[i-1][k]+j*j-c*abs(a[i]-a[i+1])+c*abs(a[i]+j-a[i+1])); } // cout<<dp[i][j]<<" "<<i<<" "<<j<<endl;; } } int ans=2e9; for(int i=0;a[n]+i<=mx;i++)ans=min(ans,dp[n][i]); cout<<ans; return 0; }