1. 程式人生 > >bzoj4576 [Usaco2016 Open]262144

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; }