Cod sursa(job #3272997)

Utilizator vladsoartavlad sofronea vladsoarta Data 31 ianuarie 2025 23:06:25
Problema Wanted Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;

const int INF = 1e18;
int dp1[201][201],dp2[201][201];

pair<int,int>coords[201];
int dist(pair<int,int>a,pair<int,int>b){
    return abs(a.first - b.first) + abs(a.second - b.second);
}

int main()
{
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>coords[i].first>>coords[i].second;
    sort(coords+1,coords+1+n);
    
    for(i=1;i<=n;i++)
    {
        if(i > 1)
        dp1[i][i] = dist(coords[i-1],coords[i]);
        if(i < n) 
        dp2[i][i] = dist(coords[i],coords[i+1]);
    }
    
    for(int d = 2;d<n;d++)
    {
        for(int i=1;i+d-1<=n;i++)
        {
            long long endinterval = i+d-1;
            dp1[i][endinterval] = INF;
            dp2[i][endinterval] = INF;
            
            for(int k=i;k<=endinterval;k++){
               if(k>i)
                    dp1[i][endinterval] = min(dp1[i][endinterval],dist(coords[i-1],coords[k]) + max(dp1[k+1][endinterval],dp2[i][k-1]))
                if(k<endinterval)
                    dp2[i][endinterval] = min(dp2[i][endinterval],dist(coords[j+1],coords[k]) + max(dp1[k+1][endinterval],dp2[i][k-1]))
            }
            
        }
    }
    
    int ans = INF;
    for(i=1;i<=n;i++)
    {
        ans = min(ans,dist(coords[0],coords[i]) + max(dp1[1][i-1],dp2[i+1][n]))
    }
    
    cout<<ans;
    return 0;
}