题目大意:n堆石子围成一圈,每堆石子的块数已知,每次可以将相邻的两堆合并到一堆,块数变为两堆之和,代价也为两堆石子块数之和。求合并到一堆的最小代价。

题目分析:先通过将前n-1依次个移到第n个后面,将环变成线。定义状态dp(i,j)表示将区间(i,j)的石子合并所需的最小代价,则状态转移方程为dp(i,j)=min(dp(i,k)+dp(k+1,j)+sum(i,j))。时间复杂度为O(n*n*n),利用四边形不等式优化,限制k(i,j)的取值范围在k(i,j-1)~k(i+1,j)之间,达到优化效果。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; const int INF=1<<30;
const int N=1005; int n;
int dp[N<<1][N<<1];
int s[N<<1][N<<1];
int sum[N<<1];
int a[N<<1]; void init()
{
sum[0]=0;
for(int i=1;i<=n;++i){
scanf("%d",a+i);
sum[i]=a[i]+sum[i-1];
}
for(int i=1;i<n;++i){
a[n+i]=a[i];
sum[n+i]=a[n+i]+sum[n+i-1];
}
} void solve()
{
for(int l=1;l<=n;++l){
for(int i=0;i+l-1<2*n;++i){
int j=i+l-1;
if(l==1){
dp[i][i]=0;
s[i][i]=i;
}else{
dp[i][j]=INF;
for(int k=s[i][j-1];k<=s[i+1][j];++k){
if(dp[i][j]>dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]){
dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
s[i][j]=k;
}
}
}
}
}
int ans=INF;
for(int i=1;i<=n;++i)
ans=min(ans,dp[i][n+i-1]);
printf("%d\n",ans);
} int main()
{
while(~scanf("%d",&n))
{
init();
solve();
}
return 0;
}

  

HDU-3506 Monkey Party (环形石子合并)的更多相关文章

  1. HDU 3506 (环形石子合并)区间dp+四边形优化

    Monkey Party Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Tot ...

  2. HDU3506环形石子合并问题

    HDU3506环形石子合并问题 线性的石子合并问题比较好理解,环形的转成线性的方法就是扩展数组 1 2 3 . . . n 1 2 3 ... n 依据是我们最优的取值可以是 1 --- n也能是 2 ...

  3. RQNOJ 490 环形石子合并

    题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...

  4. 洛谷P1880 石子合并(环形石子合并 区间DP)

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  5. HDU - 3506 Monkey Party

    HDU - 3506 思路: 平行四边形不等式优化dp 这不就是石子归并(雾 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma G ...

  6. hdu 3506 Monkey Party 区间dp + 四边形不等式优化

    http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...

  7. HDU 3506 Monkey Party(区间DP)题解

    题意:有n个石堆排成环,每次能合并相邻的两堆石头变成新石堆,代价为新石堆石子数,问最少的总代价是多少 思路:先看没排成环之前怎么做:用dp[i][j]表示合并i到j所需的最小代价,那么dp[i][j] ...

  8. dp——环形石子合并(区间dp)

    环形的解决很巧妙 #include <iostream> #include <cstring> #include <string> #include <map ...

  9. 【HDU】3506 Monkey Party

    http://acm.hdu.edu.cn/showproblem.php?pid=3506 题意:环形石子合并取最小值= =(n<=1000) #include <cstdio> ...

随机推荐

  1. Oracle和sql server中复制表结构和表数据的sql语句

    在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...

  2. MySQL数据库总结

    引擎 查看MySQL默认引擎:show variables like '%storage_engine%'; 查看表引擎:show table status from 数据库名; 修改表引擎alter ...

  3. JSP输出HTML时产生的大量空格和换行的去除方法

    在WEB应用中,如果使用jsp作为view层的显示模板,都会被空格/空换行问题所困扰.     这个问题当年也困扰了我比较长的时间.因为在jsp内使用的EL标签和其他标签时,会产生大量的空格和换行符. ...

  4. 如何写出安全的 API 接口?接口参数加密签名设计思路

    原文链接:http://blog.csdn.net/ma_jiang/article/details/53636840

  5. ubuntu16.04下无线网卡无法正常连网

    背景:无线网卡初次连接可以正常上网,但是用了一会儿就会出现无法上网的情况 版本: Ubuntu 16.04 一.分析: 1.使用ifconfig命令发现不会显示无线网卡,说明无线网卡被关闭,笔者输出的 ...

  6. c#进阶之Delegate

    委托是什么?答:委托是一种类型   等同与 一个class类,继承System.MulticastDelegate,但mult....gate是一个特殊类,不能够派生 委托的调用,如何去使用 1/委托 ...

  7. 关于Mybatis 的 Mapped Statements collection does not contain value for 异常 解决方案

    查看堆栈信息: at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:595) at org.apac ...

  8. ubuntu16.04上安装tomcat7

    sudo apt-get update sudo apt-get install tomcat7 启动:sudo service tomcat7 start 访问http://127.0.0.1:80 ...

  9. 简单了解SQL(结构化查询语言)

    简单了解SQL(结构化查询语言) 年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际 ...

  10. 探秘AOP实现原理

    可以这么说,AOP是基于动态代理实现的. 那么,这个过程是怎样的? 首先,我们有这样的一个Service类,它是被作为切面的一个类: public class Service implements U ...