分析
一道思路非常清奇的题目
我们记录一个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;
}