11.29

发布时间 2023-11-29 21:31:29作者: 电棍otto

明天考试。

今天写什么 jb 石子合并 3,然后发现要优化,于是看了眼题解里写的都是四边形不等式。

朴素 N^3算法
void work(int a[],int n)
{
    for(int i=0;i<n;++i)
        dpmin[i][0]=dpmax[i][0]=0;
    for(int j=1;j<n;++j)
        for(int i=0;i<n;++i)
        {
            dpmin[i][j]=INF;
            dpmax[i][j]=0;
            for(int k=0;k<j;++k)
            {
                    dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]+dpmin[(i+k+1)%n][j-k-1]+get(i,j));
                    dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]+dpmax[(i+k+1)%n][j-k-1]+get(i,j));
            }
        }
    minal=dpmin[0][n-1];
    maxal=dpmax[0][n-1];
    for(int i=0;i<n;++i)
    {
        minal=min(minal,dpmin[i][n-1]);
        maxal=max(maxal,dpmax[i][n-1]);
    }
}
优化后的式子 N^2
for (int r=1;r<n;r++)
         for (int i=1;i<n;i++)
        {
            int j=i+r;
            if(j>n) break;
            dp[i][j]=0;
            for (int k=s[i][j-1];k>=s[i+1][j];k++)
                if(dp[i][j]>dp[i][k]+dp[k+1][j])
                {
                    dp[i][j]=dp[i][k]+dp[k+1][j];
                    s[i][j]=k;
                }
            dp[i][j]+=sum[j]-sum[i-1];
        }

但是四边形不等式只能求解求最小值的环形石子合并问题,OJ上是求最大值。

不能求最大值。(为啥)

但是求最大值有一个性质,总是在两个端点的最大者中取到。

于是可以优化成N^2

   for(int i=2;i<=n;++i)
       for(int j=1,k;(k=i+j-1)<=2*n;++j)
            dp[j][k]=max(dp[j][k-1],dp[j+1][k])+sum[k]-sum[j-1];

可以通过 \(n<=2000\) 的数据。
插曲:我电脑上有个Veyon监视,然后我杀了他几次后发现没了,我挺高兴,打了半天代码,然后把我的博客园一刷新,诶我草,我网呢?

原来是我网线松了。

插上去之后监视又回来了。

挺谔谔的