HDU3516 树的构造

题目大意:平面上有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
",f[1][n]);
28         }
29     }
View Code
原文地址:https://www.cnblogs.com/hefenghhhh/p/4600696.html