码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3516 树的构造

时间:2015-06-25 20:58:08      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:平面上有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     }
View Code

 

HDU3516 树的构造

标签:

原文地址:http://www.cnblogs.com/hefenghhhh/p/4600696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!