제출 #1245564

#제출 시각아이디문제언어결과실행 시간메모리
1245564minhpkKas (COCI17_kas)C++20
100 / 100
322 ms196576 KiB
#include <bits/stdc++.h>
using namespace std;
int a;
int z[1000005];
int f[501][50001][2];
int sum,n;
int dp(int i,int j,int k){
    if (j>n){
        return -1e5;
    }
    if (i>a){
        if (j==0){
            return 0;
        }else{
            return -1e5;
        }
    }
    if (f[i][j][k]!=-1){
        return f[i][j][k];
    }
    f[i][j][k]=-1e5;
    int res=-1e5;
    res=max(res,dp(i+1,j,k));
    if (j+z[i]<=n){
        int preval=z[i]*(k==0)+dp(i+1,j+z[i],k);
        res=max(res,preval);
    }
    if (j-z[i]<0){
        if (abs(j-z[i])<=n){
            int preval=z[i]*(k==1)+dp(i+1,abs(j-z[i]),1-k);
            res=max(res,preval);
        }
    }else{
        int preval=z[i]*(k==1)+dp(i+1,j-z[i],k);
        res=max(res,preval);
    }
    return f[i][j][k]=res;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    for (int i=1;i<=a;i++){
         cin >> z[i];
         sum+=z[i];
    }
    n=sum/2;
    memset(f,-1,sizeof f);
    cout << max({dp(1,0,0)+sum-2*dp(1,0,0),dp(1,0,1)+sum-2*dp(1,0,1),0}) << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...