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;
}
浙公网安备 33010602011771号