bzoj4576 [Usaco2016 Open]262144

传送门

分析

一道思路非常清奇的题目

我们记录一个dp[i][j]表示在j位置大小为i的数是否可以组成

如果可以组成则dp的值为组成这个数所需要的区间的右端点的右面那个点是多少

于是暴力dp即可

58这个数是40+18得出来的

代码

#include<bits/stdc++.h>
using namespace std;
int dp[70][270000];
int main(){
    int n,m,i,j,k,Ans=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
      scanf("%d",&k);
      dp[k][i]=i+1;
    }
    for(i=2;i<=58;i++)
      for(j=1;j<=n;j++){
          if(!dp[i][j])dp[i][j]=dp[i-1][dp[i-1][j]];
          if(dp[i][j])Ans=i;
      }
    cout<<Ans;
    return 0;
}
原文地址:https://www.cnblogs.com/yzxverygood/p/10166712.html