USACO 2016 US Open Contest 262144 (bzoj4576)

262144 (262144)
 
Description
Bessie喜歡在她的手機上下載遊戲玩,儘管她發現她的大蹄使用小觸摸屏幕至關麻煩。她特別感興趣的是她正在玩
的遊戲。 遊戲從一個有N個正整數的序列開始(2≤N≤262,144),每一個數字在1...40的範圍內。 在一個步驟中,
Bessie能夠獲取具備相等值的兩個相鄰數字,而且用比這兩個數大一的值替換這兩個數值(例如,她能夠用8替換
兩個相鄰的7)。目標是在遊戲結束時最大化在序列中存在的最大數字的值。 請幫助Bessie得分儘量高!
 
題目大意:
給定一個長度爲n(n<=2^18)的序列,初始元素值爲1到40之間的整數,每次操做能夠將兩個相鄰的而且大小相同
的正整數替換成一個比原數大一的正整數。要求最大化最終數列中的最大值。

dp f[i][j]表示以j爲左端合成i的右端點位置。轉移便可。
 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <queue>
 6 #include <vector>
 7 using namespace std;
 8 const int maxn=3e5+10;
 9 int n,ans;
10 int f[60][maxn];
11 template <class T> void read(T&x)
12 {
13   x=0;char c=getchar();int f=0;
14   while(c<'0'||c>'9'){f|=(c=='-');c=getchar();}
15   while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
16   x=f?-x:x;
17 }
18 int main()
19 {
20   read(n);int a;
21   for(int i=1;i<=n;i++){read(a);f[a][i]=i+1;}
22   for(int i=2;i<=58;i++)
23    for(int j=1;j<=n;j++)
24    {
25         if(!f[i][j])f[i][j]=f[i-1][f[i-1][j]];
26      if(f[i][j])ans=max(i,ans);
27    }
28   printf("%d",ans);
29   return 0;
30 } 
View Code
相關文章
相關標籤/搜索