洛谷P3146 [USACO16OPEN]248 G
题目连接
题目大意:一列数字,相邻两行数字若相等则可以合并,合并后数值+1
大致思路:
区间DP,设f [ i ][ j ]为第i~j行完全合并的最大数
1. i == j
f [ i ][ j ] = a [ i ][ j ]
2.i < j &&f [ i ][ k ] == f[ k ][ j ]
f [ i ][ j ] = max(f [ i ][ j ],f [ i ][ k ] + 1 )
两种情况,其余情况均不符合完全合并条件
注:在寻找最大值时,定义一个ans来不断更新每个区间的最大值
最后输出
伪代码:
循环1~n
输入f [ i ][ i ];
枚举区间长度(因为要从小区间推出大区间)
······枚举起点
············枚举中间合并点
··················状态转移方程+ans更新
输出
#include <bits/stdc++.h>
using namespace std;
int f[250][250];
int main()
{
int n,ans=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&f[i][i]);
for (int l=1;l<=n;l++)
for (int i=1;i+l<=n;i++)
{
int j=i+l;
for (int k=i;k<j;k++)
{
if (f[i][k]==f[k+1][j])
f[i][j]=max(f[i][j],f[i][k]+1);
ans=max(ans,f[i][j]);
}
}
printf("%d",ans);
return 0;
}