zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    计算与软件工程作业四
    计算与软件工程作业四(一)
    计算与软件工程作业三
    计算与软件工程作业二
    计算与软件工程作业一
    4.2上机课作业
    java第三次作业
    java第一次作业 2020 3.7
    十三周上机练习
    第十二周作业
  • 原文地址:https://www.cnblogs.com/hefenghhhh/p/4600696.html
Copyright © 2011-2022 走看看