DP+简单优化,状态转移方程容易看出,优化看了http://hi.baidu.com/forverlin1204/blog/item/df9c62dc0fb16bd38d1029d8.html。哎,太粗心了,初始化时忘了得平方,看了1个多小时才发现
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int inf=2000000000; 6 const int maxn=100000+10; 7 int f[100+10],a[maxn],high[maxn],low[maxn]; 8 int n,c; 9 int main() 10 { 11 while(~scanf("%d%d",&n,&c)) 12 { 13 int i; 14 int maxv=0; 15 for(i=1;i<=n;i++) 16 { 17 scanf("%d",&a[i]); 18 maxv=max(maxv,a[i]); 19 } 20 int j; 21 for(i=0;i<a[1];i++) f[i]=inf; 22 for(i=a[1];i<=maxv;i++) f[i]=(i-a[1])*(i-a[1]); 23 for(i=2;i<=n;i++) 24 { 25 low[0]=inf; 26 for(j=1;j<=maxv;j++) 27 low[j]=min(f[j]-j*c,low[j-1]); 28 high[maxv+1]=inf; 29 for(j=maxv;j>=1;j--) 30 { 31 high[j]=min(f[j]+j*c,high[j+1]); 32 f[j]=inf; 33 } 34 for(j=a[i];j<=maxv;j++) 35 f[j]=min(low[j]+j*c+(j-a[i])*(j-a[i]),high[j]-j*c+(j-a[i])*(j-a[i])); 36 37 } 38 int ans=inf; 39 for(j=a[n];j<=maxv;j++) ans=min(ans,f[j]); 40 printf("%d\n",ans); 41 } 42 return 0; 43 }