ブロックを排除するために、問題にUVA10559ボックスソリューション

提供G [I] [J] [ K] [I] [J]は、F、Kのみと[i]は、同じ色の正方形の最大値を残し、ボックスに間隔[I、J]を排除します値のすべてのボックスの除去で[I、j]は、彼のYYクリックをシフトします。
なぜこれが右にありますか?一部区間[I、J]のために、上でいくつかのサブセクションに問題を変換することができ、Kブロックの最終決定された位置を消去し、ブロック上の最適な位置私が最後に消去されたようなスキームが存在するためサブ問題は解決します。
複雑さがある\(O(N ^ 4) \)を、それはあまりにもすることができます。

特定のコードで参照してください。

#include<bits/stdc++.h>
using namespace std;
#define N 207
#define ll long long
int g[N][N][N],f[N][N];
int last[N][N],a[N];
int main()
{
    int n,t;
    scanf("%d",&t);
    for(int o=1;o<=t;o++)
    {
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    memset(g,-0x3f,sizeof(g));
    memset(f,0,sizeof(f));
    for( int i=1;i<=n;i++)
    {
        memcpy(last[i],last[i-1],sizeof(last[i]));
        last[i][a[i-1]]=i-1;
    }   
    for(int i=n;i>=1;i--)
        for(int j=i;j<=n;j++)
        {
        f[i][j]=max((g[i][j][1]=f[i+1][j])+1,f[i][j]);
        for(int k=2;k<=n;k++)
        {
            int p=a[j]==a[i]?j:last[j][a[i]];
            while(p!=i&&g[i][p-1][k-1]!=g[0][0][0])
            {
            g[i][j][k]=max(g[i][j][k],g[i][p-1][k-1]+f[p+1][j]);
            p=last[p][a[i]];
            }
            f[i][j]=max(f[i][j],g[i][j][k]+k*k);
        }
        }
    printf("Case %d: %d\n",o,f[1][n]);
    }
    return 0;
}
            

おすすめ

転載: www.cnblogs.com/lishuyu2003/p/11728383.html