tjut 3516

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luozhong11/article/details/52366083
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1010;
const int infinity=(-1)^(1<<31);
int dp[maxn][maxn];
int s[maxn][maxn];
struct point{
    int x,y;
}p[maxn];
int S(int i,int k,int j){
    return p[k-1].y-p[j].y+p[k].x-p[i].x;
}
int DP(int n){
    //if(n <= 1) return 0;
    for(int i=1;i<=n;i++)
        dp[i][i]=0, s[i][i]=i;
    int tmp;
    for(int i=n-1;i>0;i--){
        for(int j=i+1;j<=n;j++){
            dp[i][j]=infinity;
            for(int k=max(s[i][j-1],i+1);k<=s[i+1][j];k++)
            if(dp[i][j] > (tmp=dp[i][k-1]+dp[k][j]+S(i,k,j)))
                dp[i][j]=tmp, s[i][j]=k;
        }
    }
    return dp[1][n];
}
int main()
{
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
        printf("%d\n",DP(n));
    }
    return 0;
}

阅读更多

没有更多推荐了,返回首页