想到了区间DP,但是复杂度确是O(n^3).

然后又学了新知识,四边形不等式优化。

#include <bits/stdc++.h>

using namespace std;
const int maxn=2005;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
ll dp[maxn][maxn];
ll sum[maxn],a[maxn];
int K[maxn][maxn];
int st[maxn];
int n;
void print(int l,int r,int cur){
    if(l==r){
        for(int i=0;i<cur;i++)printf("%d",st[i]);
        puts("");
        return;
    }
    st[cur]=0;
    print(l,K[l][r],cur+1);
    st[cur]=1;
    print(K[l][r]+1,r,cur+1);
}
void run(){
    for(int i=1;i<=n;i++){
        scanf("%lld",a+i);
        sum[i]=sum[i-1]+a[i];
    }
    for(int i=1;i<=n;i++){
        dp[i][i]=1;
        K[i][i]=i;
    }
    for(int d=1;d<n;d++){
        for(int i=1;i+d<=n;i++){
            int j=i+d;
            dp[i][j]=inf;
            for(int k=K[i][j-1];k<=K[i+1][j];k++){
                ll tmp=dp[i][k]+dp[k+1][j];
                if(dp[i][j]>tmp)dp[i][j]=tmp,K[i][j]=k;
            }
            dp[i][j]+=sum[j]-sum[i-1];
        }
    }
    print(1,n,0);
}
int main(){
//    freopen("in","r",stdin);
    while(scanf("%d",&n)>0)run();
    return 0;
}