码迷,mamicode.com
首页 > 其他好文 > 详细

P3146 [USACO16OPEN]248 G

时间:2020-05-20 22:47:06      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:数字   namespace   https   方法   com   计算   return   ++   cin   

有 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

标签:数字   namespace   https   方法   com   计算   return   ++   cin   

原文地址:https://www.cnblogs.com/zcxy/p/12926792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!