P3146 [USACO16OPEN] 248 G

/*
明显的区间dp
f[x][y]:x~y之间合并的最大值 
    f[x][k]==f[k+1][y]? f[x][y]=f[x][k](已经更新)+1(or ==0 就会多算)
*/
/*
4
1
1
1
2

3
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=3e2 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;

int n,f[maxn][maxn],ans;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>f[i][i],ans=max(ans,f[i][i]);
    for(int len=2;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            for(int k=l;k<r;k++){
                if(f[l][k]==f[k+1][r]&&f[l][k])
                    f[l][r]=max(f[l][r],f[l][k]+1),ans=max(ans,f[l][r]);    
            }//k=l~r-1
        }
    }
    cout<<ans<<'\n';
    
    return 0;
}

 

posted @ 2023-11-12 08:57  JMXZ  阅读(9)  评论(0)    收藏  举报