BZOJ4580: [Usaco2016 Open]248

n<=248个数字,可以进行这样的操作:将相邻两个相同的数字合并成这个数字+1,求最大能合成多少。

f(i,j)--区间i到j能合成的最大值,f(i,j)=max(f(i,k)+1),f(i,k)=f(k+1,j)。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<stdlib.h>
 5 #include<math.h>
 6 //#include<iostream>
 7 using namespace std;
 8  
 9 int n;
10 #define maxn 311
11 int f[maxn][maxn];
12 int main()
13 {
14     scanf("%d",&n);
15     int ans=0;
16     for (int i=1;i<=n;i++) scanf("%d",&f[i][i]),ans=max(ans,f[i][i]);
17     for (int len=1;len<n;len++)
18         for (int i=1,j=i+len;j<=n;i++,j++)
19         {
20             f[i][j]=-1;
21             for (int k=i;k<j;k++)
22                 if (f[i][k]==f[k+1][j]) f[i][j]=max(f[i][j],f[i][k]+1);
23             ans=max(ans,f[i][j]);
24         }
25     printf("%d\n",ans);
26     return 0;
27 }
View Code

 

posted @ 2017-10-02 14:30  Blue233333  阅读(133)  评论(0编辑  收藏  举报