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; }
相关文章推荐
- Codevs2102[石子归并 2] 区间DP
- CODEVS 2102 石子归并 2
- CodeVs 2102 石子归并 2
- CodeVS2102 石子归并 2 解题报告【区间DP】
- codevs 2102 石子归并2
- 石子归并问题(codevs 1048)
- [codevs1048]石子归并
- codevs 石子归并
- AC日记——石子归并 codevs 1048
- codevs 石子归并
- 石子归并_codevs1048_dp
- Codevs 3002 石子归并 3(DP四边形不等式优化)
- 【codevs1048】石子归并
- codevs1048石子归并
- codevs 1048 石子归并
- code[VS] 1048 石子归并
- CODEVS 1048石子归并
- 石子归并 Codevs1048 Codevs2102 Codevs3002
- Code Vs 1048 石子归并
- codevs石子归并 动态规划