#include <bits/stdc++.h>
using namespace std;
int n,a[1010],sum[1010],dp[1010][1010],bs[1010][1010];
int calsum(int st,int ed)
{
if(ed>=st)
return sum[ed]-sum[st-1];
else
return sum[n]-sum[st-1]+sum[ed];
}
int dfs(int st,int ed)
{
if(dp[st][ed]!=-1)
return dp[st][ed];
int i,tmp,af,bf,ret=1<<30;
dfs(st,(ed-1<1?n:ed-1));
dfs((st+1>n?1:st+1),ed);
af=bs[st][ed-1<1?n:ed-1];
bf=bs[st+1>n?1:st+1][ed];
for(i=af;i!=bf;i=(i+1>n?1:i+1))
{
tmp=dfs(st,i)+dfs((i+1>n?1:i+1),ed)+calsum(st,ed);
if(tmp<=ret)
{
ret=tmp;
bs[st][ed]=i;
}
}
if(bf!=ed)
{
tmp=dfs(st,bf)+dfs((bf+1>n?1:bf+1),ed)+calsum(st,ed);
if(tmp<=ret)
{
ret=tmp;
bs[st][ed]=bf;
}
}
return dp[st][ed]=ret;
}
int main()
{
int i,ans;
while(cin>>n)
{
sum[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
memset(bs,-1,sizeof(bs));
memset(dp,-1,sizeof(dp));
for(i=1;i<=n;i++)
{
bs[i][i]=i;
dp[i][i]=0;
}
ans=dfs(1,n);
for(i=2;i<=n;i++)
{
ans=min(ans,dfs(i,i-1));
}
printf("%d\n",ans);
}
}
51nod 1022 石子归并 V2
最新推荐文章于 2022-02-25 20:38:19 发布