标签:
题目大意:平面上有n个点,构成一个单调递减的序列。即对于任意的i<j,有xi<xj,yi>yj。现在要用一棵树连接这n个点。树边为有向边,只能向右或向上。求最小的权值。
分析:本题其实是式子合并的变形。
f[i][j]=f[i][k]+f[k+1][j]+y[k]-y[j]+x[k+1]-x[i]
其中s[i][j-1]<=s[i][j]<=s[i+1][j]
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #define MAXN 1005 6 int x[MAXN],y[MAXN],f[MAXN][MAXN],s[MAXN][MAXN]; 7 int main() 8 { 9 int n; 10 while(scanf("%d",&n)!=-1) 11 { 12 for(int i=1;i<=n;i++) 13 scanf("%d%d",&x[i],&y[i]); 14 memset(f,0x3f,sizeof f); 15 for(int i=1;i<=n;i++) 16 f[i][i]=0; 17 for(int i=1;i<=n;i++){s[i][i]=i;} 18 for(int i=n-1;i>=1;i--) 19 for(int j=i+1;j<=n;j++) 20 { 21 for(int k=s[i][j-1];k<=s[i+1][j];k++) 22 if(f[i][j]>f[i][k]+f[k+1][j]+y[k]-y[j]+x[k+1]-x[i]) 23 {f[i][j]=f[i][k]+f[k+1][j]+y[k]-y[j]+x[k+1]-x[i]; 24 s[i][j]=k; 25 } 26 } 27 printf("%d\n",f[1][n]); 28 } 29 }
标签:
原文地址:http://www.cnblogs.com/hefenghhhh/p/4600696.html