• 石子合并及优化


      1.石子归并

    非常朴素,顺着推即可

    w [ i ] [ j ] 表示把第i堆到第j堆的石子和到一起的最后一步的代价

    f [ i ] [ j ] = min{f [ i ] [ k ] + f [ k+1 ] [ j ] + w[ i ] [ j ] | i <= k < j , i <= j}

    for(int i=1;i<=n;++i)//长度
            for(int j=1;j+i<=n+1;++j)//起点
            {
                int e=j+i-1;
                for(int k=j;k<e;++k)//分割点
                {
                    dp1[j][e]=min(dp1[j][k]+dp1[k+1][e]+sum[e]-sum[j-1],dp1[j][e]);
                }
            }

      2.[NOI1995]石子合并

      在上面那个问题略微变动一下,变成了环形,可以将其暴力拆成链

    void read()
    {
        memset(dp1,0x3f,sizeof(dp1));
        red(n);
        for(int i=1;i<=n;++i)
        {
            red(a[i]);
            a[i+n]=a[i];
        }
    }
    void work()
    {
        for(int i=1;i<=2*n;++i)
        {
            sum[i]=sum[i-1]+a[i];
            dp1[i][i]=0;
        }
        for(int i=1;i<=n;++i)
            for(int j=1;j+i<2*n;++j)
            {
                int e=j+i-1;
                for(int k=j;k<e;++k)
                {
                    dp1[j][e]=min(dp1[j][k]+dp1[k+1][e]+sum[e]-sum[j-1],dp1[j][e]);
                    dp2[j][e]=max(dp2[j][k]+dp2[k+1][e]+sum[e]-sum[j-1],dp2[j][e]);
                }
            }
        minn=INF;
        for(int i=1;i<=n;++i)
        {
            minn=min(minn,dp1[i][i+n-1]);
            maxx=max(maxx,dp2[i][i+n-1]);
        }
        printf("%d
    %d",minn,maxx);
    }

      3.四边形优化

      上面的朴素写法复杂度都是O(n^3),有没有更好的写法吗?

      有,利用数学里的四边形不等式

      f[a][c]+f[b][d]<=f[b][c]+f[a][d]

      交叉小于包含,即交叉的两个区间,a到c和b到d的值满足小于等于包含的两个区间[bc包含于ad])
      则说这个东西满足四边形不等式

       简而言之,就是该区间的最优分割点一定在前一个区间和后一个区间之间,即:

      s [ i ] [ j - 1 ] <= s [ i ] [ j ] <= s [ i + 1 ] [ j ]

      

    for(int i=1;i<=n;++i)
            for(int j=1;j+i<2*n;++j)
            {
                int e=j+i-1;
                for(int k=r[j][e-1];k<=r[j+1][e];++k)
                {
                    if(dp1[j][e]>dp1[j][k]+dp1[k+1][e]+sum[e]-sum[j-1])
                    {
                        dp1[j][e]=dp1[j][k]+dp1[k+1][e]+sum[e]-sum[j-1];
                        r[j][e]=k;
                    }
                }
            }

     

  • 相关阅读:
    盘点 | 2020年金融科技大事记:监管与后疫情
    2020年业务安全领域12大事件
    安装zsh时git太慢,换代理
    springboot 日志处理 aop
    DataPipeline荣获湾区创见&#183;2020网络安全大会 TECHSPARK 十强奖
    PI-S4 Proxy相关配置
    PI-海外银企直联方案
    Mendix-Websites
    crawler-美国GDP数据预测
    AST-web端javascript逆向杀器之认识AST
  • 原文地址:https://www.cnblogs.com/Achensy/p/10803092.html
Copyright © 2020-2023  润新知