poj 3042
经典dp。
代码:
#include<iostream> #include<fstream> using namespace std; int a[1010]; int dp[1010][1010][2]; int v[1010][1010][2]; int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b; } int n,m; int solve(int s,int t,int f){ int i,j,k; if(v[s][t][f]) return dp[s][t][f]; v[s][t][f]=1; if(f==0) { if(s==1&&t>n) { dp[s][t][f]=0; return 0; } i=-1;j=-1; if(s>1) i=solve(s-1,t,0); if(t<=n) j=solve(s-1,t,1); if(i!=-1&&j!=-1) dp[s][t][f]=min(i+(a[s]-a[s-1])*(s-1+n-t+1),j+(a[t]-a[s])*(s-1+n-t+1)); if(i==-1) dp[s][t][f]=j+(a[t]-a[s])*(s-1+n-t+1); if(j==-1) dp[s][t][f]=i+(a[s]-a[s-1])*(s-1+n-t+1); return dp[s][t][f]; } else { if(t==n&&s<1){ dp[s][t][f]=0; return 0; } i=-1;j=-1; if(t<n) i=solve(s,t+1,1); if(s>=1) j=solve(s,t+1,0); if(i!=-1&&j!=-1) dp[s][t][f]=min(i+(a[t+1]-a[t])*(s+n-t),j+(a[t]-a[s])*(s+n-t)); if(i==-1) dp[s][t][f]=j+(a[t]-a[s])*(s+n-t); if(j==-1) dp[s][t][f]=i+(a[t+1]-a[t])*(s+n-t); return dp[s][t][f]; } } void read(){ // ifstream cin("in.txt"); int i,j,k; cin>>n>>m; a[1]=m; for(i=2;i<=n+1;i++) cin>>a[i]; n++; qsort(a+1,n,sizeof(int),cmp); for(i=1;i<=n;i++) if(a[i]==m) break; if(i<n) { solve(i,i+1,0); cout<<dp[i][i+1][0]<<endl; } else { solve(i-1,i,1); cout<<dp[i-1][i][1]<<endl; } } int main(){ read(); return 0; }