zoukankan      html  css  js  c++  java
  • hdu3516

      题目大意:这个。。。。翻译起来还真是不好说,各位四六没过的ACMer正好去原网页看看题意,过了的好孩子还是去看看原网页看看锻炼一下吧。(当然我做这道题目的时候,教练已经摆明说要用四边形不等式,所以还是感觉没什么压力的)这样我一眼就看出来了题意描述的问题:应该澄清如果(i,j)这两个点放在一个区间(一棵树上),就必须要以点(xi,yj)作为最近公共祖先

      然后来分析一下优化因素:

    1. 如果(i<=k<=j)当前最优解中(i,j)是放在一棵子树上的,那么k一定也在这棵子树上。(这一点很容易想到吧?这是由题目条件xi<xj,yi>yj决定的
    2. (i<=k<=j && i<j)令s[i][j]是将(i,j)放在一棵子树Tree(i,j)上最优解——Tree(i,j)右子树的左端点,则max(s[i][j-1],i+1)<=s[i][j]<=s[i+1][j]。

      其实四边形不等式最重要的是函数的四边形性质(a<=b<=c<=d) m[a][c]+m[b][d]<=m[a][d]]+m[b][c],带来的解的单调性s[i-1][j]<=s[i][j]<=s[i][j+1]。当然具体题目要具体分析,诸如我之前的文章所提到的dp的方向有向上(k=i-1)和向下(k=i+1)的区别一样。不管怎么样,最核心的一点是解的单调性

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=1010;
     6 const int infinity=(-1)^(1<<31);
     7 int dp[maxn][maxn];
     8 int s[maxn][maxn];
     9 struct point{
    10     int x,y;
    11 }p[maxn];
    12 int S(int i,int k,int j){
    13     return p[k-1].y-p[j].y+p[k].x-p[i].x;
    14 }
    15 int DP(int n){
    16     //if(n <= 1) return 0;
    17     for(int i=1;i<=n;i++)
    18         dp[i][i]=0, s[i][i]=i;
    19     int tmp;
    20     for(int i=n-1;i>0;i--){
    21         for(int j=i+1;j<=n;j++){
    22             dp[i][j]=infinity;
    23             for(int k=max(s[i][j-1],i+1);k<=s[i+1][j];k++)
    24             if(dp[i][j] > (tmp=dp[i][k-1]+dp[k][j]+S(i,k,j)))
    25                 dp[i][j]=tmp, s[i][j]=k;
    26         }
    27     }
    28     return dp[1][n];
    29 }
    30 int main()
    31 {
    32     int n;
    33     while(cin>>n){
    34         for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
    35         printf("%d
    ",DP(n));
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Go对比其他语言新特性2(函数、包、错误处理)
    计算机基础知识
    GO的下载和环境配置,Goland编译器的配置和初始化项目
    软件工程第五次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    软件工程结对第二次作业
    软件工程结对第一次作业
  • 原文地址:https://www.cnblogs.com/karlvin/p/3332968.html
Copyright © 2011-2022 走看看