1. 程式人生 > >BZOJ4580: [Usaco2016 Open]248

BZOJ4580: [Usaco2016 Open]248

數字 play close 多少 () col 技術 def esp

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

BZOJ4580: [Usaco2016 Open]248