[DP 区间 转移限制] P3146 [USACO16OPEN]248 G
Posted 鱼竿钓鱼干
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[DP 区间 转移限制] P3146 [USACO16OPEN]248 G相关的知识,希望对你有一定的参考价值。
[DP 区间 转移限制] P3146 [USACO16OPEN]248 G
题目
思路
考虑转移条件:相邻且值相同
如何保证相邻,直接区间DP本身就是考虑相邻两块的。
值相同,区间DP左半块和右半块相同即可
i
f
(
f
[
i
]
[
k
]
=
=
f
[
k
+
1
]
[
j
]
)
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
+
1
]
+
1
)
if(f[i][k]==f[k+1][j])f[i][j]=max(f[i][j],f[i][k+1]+1)
if(f[i][k]==f[k+1][j])f[i][j]=max(f[i][j],f[i][k+1]+1)
由于转移受限制,最终区间
f
[
1
]
[
n
]
f[1][n]
f[1][n]不一定可以合成出来,所以对所有区间取max作为答案
代码
// Problem: P3146 [USACO16OPEN]248 G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3146
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// FishingRod
#include<bits/stdc++.h>
using namespace std;
#define endl "\\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY
*/
int T;
const int N=258;
int a[N];
LL f[N][N];
void solve(int C)
{
//NEW DATA CLEAN
//NOTE!!!
int n;cin>>n;
LL ans=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)f[i][i]=a[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[k+1][r])f[l][r]=max(f[l][r],f[l][k]+1);
ans=max(ans,f[l][r]);
}
}
cout<<ans;
}
int main()
{
#ifdef MULINPUT
scanf("%d",&T);
for(int i=1;i<=T;i++)solve(i);
#else
solve(1);
#endif
return 0;
}
以上是关于[DP 区间 转移限制] P3146 [USACO16OPEN]248 G的主要内容,如果未能解决你的问题,请参考以下文章