P3146 [USACO16OPEN]248 G

Posted zcxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3146 [USACO16OPEN]248 G相关的知识,希望对你有一定的参考价值。

有 n 个整数,求将其合并的最大值。
合并规则为:只有相邻且相等的两个数字能够合并,且合并的值为 合并前的值+1 题目链接
例如输入的值为 4 1 1 1 2, 输出的值应该为 3 。
首先将第二个和第三个数进行合并,那么这串数字变为 1 2 2,将2,2合并得 3 。

方法:区间DP
状态表示:f[i][j] 表示将i~j的所有数字全部合并的值
状态计算:枚举中间值 k ,判断条件是f[l][k] == f[k+1][r],并且二者不能为0,因为如果为 0 就表示这个区间的值无法合并,这样的 f 是无意义的

Code:

#include<bits/stdc++.h>

using namespace std;

const int N = 300;

int n;
int ans = -1e9;
int f[N][N];

int main()
{
    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 i = 1;i <= n && i+len-1 <= n;i++)
        {
            int l = i,r = i+len-1;
            for(int k = l;k < r;k++)
                if(f[l][k] == f[k+1][r] && f[l][k] && f[k+1][r])
                {
                    f[l][r] = max(f[l][r], f[l][k]+1);
                    ans = max(ans,f[l][k]+1);
                }
        }
    }
    cout << ans << endl;
    
    return 0;
}

以上是关于P3146 [USACO16OPEN]248 G的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P3146 [USACO16OPEN]248

洛谷P3146 [USACO16OPEN]248

P3146 [USACO16OPEN]248

luogu P3146 [USACO16OPEN]248

luogu3146 [USACO16OPEN]248

USACO16OPEN 248