bzoj1237 wikioi2430 [SCOI2008]配对 dp

来源:互联网 发布:淘宝drjart天猫旗舰店 编辑:程序博客网 时间:2024/05/21 10:10
如果更改的位置超过3位那么一定不是最优解。不信自己举例子。
#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define INF 0x7ffffffffffll#define maxn 110000#define ll long longll f[maxn];int a[maxn],n,b[maxn];ll get(int x,int y){    if(x==y)        return INF;    return abs(x-y);}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&a[i],&b[i]);    }    sort(a+1,a+1+n);    sort(b+1,b+1+n);    f[1]=get(a[1],b[1]);    f[2]=min(f[1]+get(a[2],b[2]),get(a[1],b[2])+get(a[2],b[1]));    for(int i=3;i<=n;i++)    {        f[i]=f[i-1]+get(a[i],b[i]);        f[i]=min(f[i],f[i-2]+get(a[i],b[i-1])+get(a[i-1],b[i]));        f[i]=min(f[i],f[i-3]+get(a[i-2],b[i])+get(a[i-1],b[i-2])+get(a[i],b[i-1]));        f[i]=min(f[i],f[i-3]+get(a[i-2],b[i-1])+get(a[i-1],b[i])+get(a[i],b[i-2]));        f[i]=min(f[i],f[i-3]+get(a[i-2],b[i])+get(a[i-1],b[i-1])+get(a[i],b[i-2]));    }    if(f[n]>INF) printf("-1");    else printf("%lld",f[n]);    return 0;}

0 0