论文献上。。 Click Me~~
对于这种问题,论文中已经讲的很清楚了,这个题和论文中第一题非常像。
stl 中的 abs 真是鬼畜,本地和POJ 上不一样,老是说不确定
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <set>
#include <stack>
using namespace std;
#define READ freopen("acm.in","r",stdin)
#define WRITE freopen("acm.out","w",stdout)
#define ll int
#define ull unsigned long long
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define MII map<int,int>::iterator
#define fst first
#define sec second
#define MS(x,d) memset(x,d,sizeof(x))
#define INF 0x3f3f3f3f
#define ALL(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ROOT 0,n-1,1
#define PB push_back
#define FOR(a,b,c) for(int a=b;a<c;a++)
#define MOD 1000000007
#define keyTree (ch[ ch[root][1] ][0])
#define MAX 1111
#define SIG 128
ll dp[2][MAX][MAX];// 0 i 1 j
ll n,l;
ll pos[MAX];
int main()
{
while(scanf("%d%d",&n,&l)!=EOF)
{
int S=-1;
for(int i=1;i<=n;i++)
{
scanf("%d",&pos[i]);
if(pos[i]==l)
S=0;
}
if(S==-1)
{
pos[n+1]=l;
n++;
}
sort(pos+1,pos+n+1);
for(int i=1;i<=n;i++)
if(pos[i]==l)
{
S=i;
break;
}
for(int k=0;k<2;k++)
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
dp[k][i][j]=INF;
dp[0][S][S]=dp[1][S][S]=0;
for(int i=S;i>=1;i--)
{
for(int j=S;j<=n;j++)
{
int tn=i+n-j;
ll v1,v2;
v1=dp[0][i+1][j]+tn*(abs(pos[i]-pos[i+1]));
v2=dp[1][i+1][j]+tn*(abs(pos[j]-pos[i]));
dp[0][i][j]=min(v1,v2);
v1=dp[0][i][j-1]+tn*(abs(pos[i]-pos[j]));
v2=dp[1][i][j-1]+tn*(abs(pos[j-1]-pos[j]));
dp[1][i][j]=min(v1,v2);
}
}
cout<<min(dp[0][1][n],dp[1][1][n])<<endl;
}
return 0;
}