[Usaco2016 Open] 248
时间限制: 10秒 内存限制: 128 MB提交: 124 Solved: 100
[ 提交 ] [ Status ] [ 讨论 ]
描述
Bessie喜欢下载游戏,在她的手机上玩,即使她发现了小触摸
屏幕相当麻烦与她的大蹄使用。她特别感兴趣的是目前的g
她正在玩。游戏从NN正整数序列(2≤N≤248)开始,每个都在
范围1 ... 40。在一个移动中,Bessie可以取相等值的两个相邻数字,并替换它们
单个数值大一个(例如,她可以用8代替两个相邻的7)。目标是
以在游戏结束时最大化在序列中存在的最大数字的值。请
帮助Bessie得分尽可能高!
输入
第一行输入包含N,接下来的N行在开始时给出N个数字的序列
的游戏。
输出
请输出Bessie可以生成的最大整数。
样品输入
4
1
1
1
2
1
1
1
2
示例输出
3
//在这里所示的示例中,Bessie首先合并第二个和第三个1以获得序列1 2 2
,然后她将2s合并为3.注意,连接前两个1不是最佳的。
//在这里所示的示例中,Bessie首先合并第二个和第三个1以获得序列1 2 2
,然后她将2s合并为3.注意,连接前两个1不是最佳的。
dp[i][j] 表示插入第 i 个数后,最大值为 j 的数的位置
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
using namespace std;
int main()
{
const int N=300;
int n,x,ans=0;
int dp[N][60];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
dp[i][x]=i;
int j=i-1;
while(dp[j][x])
{
j=dp[j][x]-1;
dp[i][++x]=j+1;
}
ans=max(ans,x);
}
printf("%d\n",ans);
}