zoukankan      html  css  js  c++  java
  • LETTers练习赛第十场 第一题

    【题目意思】给你很多个点,这些点满足a set of points (xi, yi) that satisfy xi < xj and yi > yj for all i < j.让你用一棵树把所有点连在一齐,树只能往上跟右生长,求树的总长度最小

     【解题思路】类似石子合并,加上四边形优化就行了 
     定义状态 dp[i,j]表示点i到点j合并在一起的最小花费(树枝的长度), 
     状态转移方程:dp[i,j]= min(dp[i,k]+dp[k+1,j]+cost(i,j) ) i<k<j 
     cost(i,j)=py[k]-py[j]+px[k+1]-px[i]; 
     当j固定时,cost(i,j)单调递减函数 
     我们猜测cost(i,j)满足四边形不等式 
     证明: F(i)=cost(i,j+1)-cost(i,j)=py[j]-py[j+1]是一个与i无关的多项式, 
     所以j固定时,F(i)满足四边形不等式,得证。 
     s[i,j]=k;s[i-1,j] <= s[i,j] <= s[i,j+1]; 
     由于决策s具有单调性,因此状态转移方程可修改为: 
    HDU 3516 Tree Construction DP + 四边形不等式 - chensmiles - chensmiles 
    下面是AC代码:
    #include <iostream>  
    using namespace std; 
    int dp[1010][1010];
    int mm[1010][1010];  
    int main(){
    int n;
    int x[1010];
    int y[1010];
    while(scanf("%d",&n)!=EOF){
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
    scanf("%d%d",&x[i],&y[i]);
    mm[i][i]=i;
    }
    for(int ln=2;ln<=n;ln++){
    for(int i=1;i<=n-ln+1;i++){
    dp[i][i+ln-1]=999999;
    for(int j=mm[i][i+ln-2];j<=mm[i+1][i+ln-1];j++){
    if(dp[i][i+ln-1]>dp[i][j]+dp[j+1][i+ln-1]+abs(x[j+1]-x[i])+abs(y[i+ln-1]-y[j])){
    dp[i][i+ln-1]=dp[i][j]+dp[j+1][i+ln-1]+abs(x[j+1]-x[i])+abs(y[i+ln-1]-y[j]);
    mm[i][i+ln-1]=j;
    }
    }
    }
    }
    printf("%d\n",dp[1][n]); 
    }
    return 0; 
    }
  • 相关阅读:
    MQTT:前端js客户端库MQTT.js
    MQTT:java客户端库Paho
    EMQ X:认证
    EMQ X:初体验
    MQTT协议
    连接Mysql时报javax.net.ssl.SSLHandshakeException No appropriate protocol (protocol is disabled or cipher suites are inappropriate)错误
    微星11代gp76 3070解锁140w功率
    Jenkins:使用ssh方式拉取gitlab代码
    juc:AQS
    juc:LockSupport
  • 原文地址:https://www.cnblogs.com/LETTers/p/2490553.html
Copyright © 2011-2022 走看看