Submission #1359443

#TimeUsernameProblemLanguageResultExecution timeMemory
1359443ivazivaBigger segments (IZhO19_segments)C++20
13 / 100
140 ms327680 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 505
#define int long long

int n,a[MAXN],pref[MAXN];
int dp[MAXN][MAXN][MAXN];
int maksi[MAXN][MAXN];

int32_t main()
{
    cin>>n;for (int i=1;i<=n;i++) cin>>a[i];
    pref[0]=0;for (int i=1;i<=n;i++) pref[i]=pref[i-1]+a[i];
    if (n<=20)
    {
        int answer=0;
        for (int maska=0;maska<(1<<n);maska++)
        {
            vector<int> positions;positions.push_back(0);
            for (int bit=0;bit<n;bit++)
            {
                if (maska&(1<<bit)) positions.push_back(bit+1);
            }
            if (positions[(int)positions.size()-1]!=n) continue;
            vector<int> values;
            for (int i=1;i<(int)positions.size();i++) values.push_back(pref[positions[i]]-pref[positions[i-1]]);
            bool valid=true;
            for (int i=1;i<(int)values.size();i++)
            {
                if (values[i]<values[i-1]) {valid=false;break;}
            }
            if (valid) answer=max(answer,(int)values.size());
        }
        cout<<answer<<endl;
        return 0;
    }
    if (n<=500)
    {
        for (int i=1;i<=n;i++)
        {
            for (int j=1;j<=n;j++)
            {
                for (int k=1;k<=n;k++) dp[i][j][k]=-LLONG_MAX;
            }
        }
        for (int i=1;i<=n;i++)
        {
            for (int j=1;j<=n;j++) maksi[i][j]=-LLONG_MAX;
        }
        for (int i=1;i<=n;i++) maksi[1][i]=1;
        for (int r=1;r<=n;r++)
        {
            for (int l=r-1;l>=1;l--)
            {
                for (int x=l+1;x<=r;x++)
                {
                    if (pref[x-1]-pref[l-1]>pref[r]-pref[x-1]) continue;
                    if (maksi[l][x-1]==-LLONG_MAX) continue;
                    dp[l][x][r]=maksi[l][x-1]+1;
                }
            }
            for (int l=r-1;l>=1;l--)
            {
                for (int x=l+1;x<=r;x++) maksi[x][r]=max(maksi[x][r],dp[l][x][r]);
            }
        }
        int answer=0;
        for (int l=n;l>=1;l--) answer=max(answer,maksi[l][n]);
        cout<<answer<<endl;return 0;
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...