P3146 [USACO16OPEN]248 G
考察:区间dp
思路:
f[i][j]代表[i,j]合成后的最大值,根据题意,只有当f[i][k]=f[k+1][j]时,才能合并,即f[i][j] = max(f[i][j],f[i][k]+1).这道题求的是合并过程中的最大值,因此答案不一定是f[1][n].
注意:根据题意,只有当ai = aj 时才能+1,否则=两者之间的最值
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 const int N = 300; 7 int a[N],f[N][N]; 8 int main() 9 { 10 int n,ans = 0; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 13 for(int i=1;i<=n;i++) f[i][i] = a[i]; 14 for(int len=2;len<=n;len++) 15 for(int l=1;l+len-1<=n;l++) 16 { 17 int r = l+len-1; 18 for(int k=l;k<r;k++) 19 if(f[l][k]==f[k+1][r]) f[l][r] = max(f[l][r],f[l][k]+1); 20 ans = max(f[l][r],ans); 21 } 22 printf("%d\n",ans); 23 return 0; 24 }