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的主要内容,如果未能解决你的问题,请参考以下文章