想到了区间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;
}
浙公网安备 33010602011771号