天天看點

P3146 [USACO16OPEN]248 G

思路:

#include<bits/stdc++.h>
using namespace std;
int a[300];
int dp[300][300];

int main()
{
  int n;
  cin>>n;
  for(int i = 1; i <= n; i++)
  {
    cin>>a[i];
    dp[i][i] = a[i];
  }
  int ans = 0;
  for(int len = 1; len <= n; len++)
  {
    for(int i = 1; i + len-1 <= n; i++)
    {
      int end = i+len-1;
      if(len > 2)
      {
        for(int k = i; k <= end; k++)
        {
          if(dp[i][k] == dp[k+1][end] && dp[i][k] != 0 && dp[k+1][end] != 0)
          {
            dp[i][end] = max(dp[i][end], dp[i][k]+1);
            ans = max(ans,dp[i][end]);
          }
        }
      }
      else
      {
        if(a[i] == a[i+1])
        dp[i][i+1] = a[i]+1;
      }
    }
  }
  printf("%d\n",ans);
}      

繼續閱讀