1 条题解

  • 0
    @ 2025-11-20 21:09:16

    E59 四边形不等式优化DP Optimal Binary Search Tree

    //传统超时的代码
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N=300;
    int n, e[N], s[N];
    int f[N][N];//f[i,j]表示给区间[i,j]建排序二叉树的最小费用
    
    int main(){
      while(~scanf("%d",&n)){
        for(int i=1; i<=n; i++)
          scanf("%d",&e[i]), s[i]=s[i-1]+e[i];
          
        memset(f,0x3f, sizeof f);
        for(int i=1;i<=n;i++) f[i][i]=f[i][i-1]=f[i+1][i]=0;
        
        for(int len=2; len<=n; len++)
          for(int i=1,j; (j=i+len-1)<=n; i++)
            for(int k=i; k<=j; k++)
              if(f[i][j]>f[i][k-1]+f[k+1][j]+s[j]-s[i-1]-e[k])
                 f[i][j]=f[i][k-1]+f[k+1][j]+s[j]-s[i-1]-e[k];
        printf("%d\n", f[1][n]);
      }
    }
    
    //标程
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N=300;
    int n,e[N],s[N];
    int f[N][N];//f[i,j]表示给区间[i,j]建排序二叉树的最小费用
    int p[N][N];//p[i,j]表示状态f[i,j]的最优决策点
    
    int main(){
      while(~scanf("%d",&n)){
        for(int i=1; i<=n; i++)
          scanf("%d",&e[i]),s[i]=s[i-1]+e[i];
        
        memset(f,0x3f,sizeof(f));
        for(int i=1; i<=n; i++)
          f[i][i]=f[i+1][i]=f[i][i-1]=0, p[i][i]=i;
        
        for(int len=2; len<=n; len++)
          for(int i=1,j; (j=i+len-1)<=n; i++)
            for(int k=p[i][j-1]; k<=p[i+1][j]; k++)
              if(f[i][j]>f[i][k-1]+f[k+1][j]+s[j]-s[i-1]-e[k])
                f[i][j]=f[i][k-1]+f[k+1][j]+s[j]-s[i-1]-e[k], p[i][j]=k;
        printf("%d\n",f[1][n]);
      }
    }
    
    • 1

    E59 四边形不等式优化DP [UVA10304] Optimal Binary Search Tree

    信息

    ID
    1783
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者