loj上区间动规分离与合体的没用的题解

分离与合体这道题,我看很多大佬的做法都。。。不太亲民,就决定自己想一想。

虽然这是一道区间动规题,但我做的时候并没有往哪个方向想。我的总体思想就是最短路径思想,然后枚举,一个区间一个区间的枚举。

(真.无双.暴力

代码如下:

#include
using namespace std;
int n,a[301];//n为区间数,a数组为区间里金钥匙的价值 
int f[301][301],path[301][301];//f[i][j]指的是从第i到第j区间可获得的金钥匙的最大价值
//path[i][j]存的是在i到j区间之间LYD分裂的区间 
int q[301][2];
//q[i][0]为当前区间的左端点,q[i][1]为右端点 
void Print()
{
    int l=1,r=1;
    q[1][0]=1,q[1][1]=n;
    while(l<=r)
    {
        int a=path[q[l][0]][q[l][1]];
        cout<" ";
        if(q[l][0]!=a)
        {
            r++;
            q[r][0]=q[l][0];
            q[r][1]=a;
        }
        if(q[l][1]!=a+1)
        {
            r++;
            q[r][0]=a+1;
            q[r][1]=q[l][1];
        }
        l++;
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
    }
    for(int i=2;i<=n;++i)
    {
        for(int j=1;j<=n-i+1;++j)
        {
            int t=i+j-1;
            for(int k=j;kif(f[j][t]1][t]+(a[j]+a[t])*a[k])
                {
                    f[j][t]=f[j][k]+f[k+1][t]+(a[j]+a[t])*a[k];
                    path[j][t]=k;
                }
            }
        }
    }
    cout<1][n]<

总的来讲,这题并没有那么麻烦的必要。。。

何苦为难自己呢。。。

其实我觉得输出最难(你滚)

你可能感兴趣的:(蒟蒻的渣解)