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 }