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 }

 

posted @ 2021-02-11 02:16  acmloser  阅读(40)  评论(0编辑  收藏  举报