Cod sursa(job #1413035)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 1 aprilie 2015 18:14:30
Problema Wanted Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<cstdio>
#include<vector>
#define ics first
#define igrec second
#include<algorithm>

using namespace std;

int abs(int x)
{
    if(x>0)
    {
        return x;
    }
    return -x;
}

int max(int x,int y)
{
    if(x>y)
    {
        return x;
    }
    return y;
}

int d,d1[201][201],d2[201][201],i,n,k,i2,mn;
pair<int,int> a[201];

int main()
{
    freopen("wanted.in","r",stdin);
    freopen("wanted.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].ics,&a[i].igrec);
    }
    if(n==1)
    {
        printf("%d\n",a[1].igrec);
        return 0;
    }
    a[0].ics=a[0].igrec=0;
    sort(a+1,a+n+1);
    for(i=2;i<=n;i++)
    {
        d1[i][i]=0;
        d2[i][i]=0;
        d1[i][i+1]=abs(a[i].ics-a[i+1].ics)+a[i+1].igrec;
        d2[i][i+1]=abs(a[i].ics-a[i+1].ics)+a[i].igrec;
    }
    for(i=2;i<n;i++)
    {
        for(i2=i+1;i2<=n;i2++)
        {
            d=i2-i;
            d1[d][i2]=abs(a[d].ics-a[i2].ics)+2*a[i2].igrec+d2[d+1][i2];
            d2[d][i2]=abs(a[d].ics-a[i2].ics)+2*a[d].igrec+d1[d][i2-1];
            for(k=d+1;k<i2;k++)
            {
                if(abs(a[d].ics-a[k].ics)+2*a[k].igrec+max(d2[d+1][k],d1[k][i2])<d1[d][i2])
                {
                    d1[d][i2]=abs(a[d].ics-a[k].ics)+2*a[k].igrec+max(d2[d+1][k],d1[k][i2]);
                }
                if(abs(a[d].ics-a[i2].ics)+2*a[k].igrec+max(d2[d][k],d1[k][i2-1])<d2[d][i2])
                {
                    d2[d][i2]=abs(a[d].ics-a[i2].ics)+2*a[k].igrec+max(d2[d][k],d1[k][i2-1]);
                }
            }
        }
    }
    mn=2000000000;
    for(i=1;i<=n;i++)
    {
        if(abs(a[i].ics)+2*a[i].igrec+max(d2[1][i],d1[i][n])<mn)
        {
            mn=abs(a[i].ics)+2*a[i].igrec+max(d2[1][i],d1[i][n]);
        }
    }
    printf("%d\n",mn);
}