您的位置:首页 > 其它

codevs2102 石子归并 2

2014-11-06 15:56 246 查看
那年还是孩子的我一位有多难,现在的少年拿记忆化搜索虐杀。
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 160000
int dp[310][310],dp2[310][310],sum[310],n;
int getint()
{
int res;
char c;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int dfs(int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
if(l==r)
{
return 0;
}
int maxl=0x3f3f3f3f;
for(int i=l;i<r;i++)
{
maxl=min(maxl,dfs(l,i)+dfs(i+1,r)+sum[r]-sum[l-1]);
}
dp[l][r]=maxl;
return dp[l][r];
}
int dfs2(int l,int r)
{
if(dp2[l][r]!=-1)
return dp2[l][r];
if(l==r)
{
return 0;
}
int maxl=0;
for(int i=l;i<r;i++)
{
maxl=max(maxl,dfs2(l,i)+dfs2(i+1,r)+sum[r]-sum[l-1]);
}
dp2[l][r]=maxl;
return dp2[l][r];
}
int main()
{
memset(dp,-1,sizeof(dp));
memset(dp2,-1,sizeof(dp2));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
sum[i+n]=sum[i]=getint();
}
for(int i=1;i<=2*n;i++)
{
sum[i]+=sum[i-1];
}
int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
ans=min(ans,dfs(i,i+n-1));
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
{
ans=max(ans,dfs2(i,i+n-1));
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: