HDU3506 Monkey Party (区间DP)
一道好题......
首先要将环形转化为线形结构,接着就是标准的区间DP,但这样的话复杂度为O(n3),n<=1000,要超时,所以要考虑优化。
dp[i][j]=min( dp[i][k]+dp[k+1][j]+sum(i,j) ),我们通过证明sum(i,j)满足四边不等式和区间包含单调性,从而dp[i][j]也满足四边不等式,进一步得到对于决策s(i,j),满足s(i,j-1)<=s(i,j)<=s(i+1,j),i<=j. 然后就可以优化到O(n2).
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int INF=0x3f3f3f3f;
6 const int N=1005;
7 int n;
8 int dp[N<<1][N<<1];
9 int s[N<<1][N<<1];//记录决策点
10 int sum[N<<1];//前缀和
11 int a[N<<1];
12
13 void init(){
14 sum[0]=0;
15 for(int i=1;i<=n;i++){
16 scanf("%d",&a[i]);
17 sum[i]=a[i]+sum[i-1];
18 dp[i][i]=0;//自己认识自己不需要时间
19 s[i][i]=i;
20 }
21 for(int i=1;i<n;i++){//环形处理为线形
22 a[n+i]=a[i];
23 sum[n+i]=a[n+i]+sum[n+i-1];
24 dp[n+i][n+i]=0;
25 s[n+i][n+i]=n+i;
26 }
27 }
28
29 void solve(){
30 for(int d=2;d<=n;d++)
31 for(int i=1;i<=2*n-d;i++){
32 int j=i+d-1;
33 int tmp=sum[j]-sum[i-1];
34 dp[i][j]=INF;
35 for(int k=s[i][j-1];k<=s[i+1][j];k++)//四边不等式优化
36 if(dp[i][k]+dp[k+1][j]+tmp<dp[i][j]){
37 dp[i][j]=dp[i][k]+dp[k+1][j]+tmp;
38 s[i][j]=k;//记录决策点
39 }
40 }
41 int ans=INF;
42 for(int i=1;i<=n;i++)
43 ans=min(ans,dp[i][n+i-1]);
44 printf("%d\n",ans);
45 }
46
47 int main(){
48 while(~scanf("%d",&n)){
49 init();
50 solve();
51 }
52 return 0;
53 }
HDU3506 Monkey Party (区间DP)的更多相关文章
- hdu3506 Monkey Party (区间dp+四边形不等式优化)
题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆.然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍 ...
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
- 区间DP入门题目合集
区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解. 基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始 ...
- 区间dp(模板+例题)
参考博文:区间dp小结(附经典例题) 首先,什么是区间dp?它是干什么的? 先在小区间进行DP得到最优解,然后再利用小区间的最优解合并求大区间的最优解 操作往往涉及到区间合并问题 以上. 模板如下: ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
随机推荐
- 解气!哈工大被禁用MATLAB后,国产工业软件霸气回击
提起哈尔滨工业大学,相信很多人都不会陌生. 它是中国顶级的C9院校之一,从1920年建校的百余年来,哈工大一直享誉"工科强校"的美称,因其在航天领域的不凡成就,更是被人们誉为&qu ...
- python 文件操作(读写等)
简介 在实际开发中我们需要对文件做一些操作,例如读写文件.在文件中新添内容等,通常情况下,我们会使用open函数进行相关文件的操作,下面将介绍一下关于open读写的相关内容. open()方法 ope ...
- 主流前沿的开源监控和报警系统Prometheus+Grafana入门之旅
Prometheus概述 定义 Prometheus 官网地址 https://prometheus.io/ Prometheus 官网文档地址 https://prometheus.io/docs/ ...
- Sonatype Nexus3 搭建私有仓库
Nexus是Sonatype提供的仓库管理平台,Nuexus Repository OSS3能够支持Maven.npm.Docker.YUM.Helm等格式数据的存储和发布:并且能够与Jekins.S ...
- LuoguP1020 导弹拦截 (LIS)
最长不降和单升 #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- Luogu1038 神经网络 (拓扑排序)
拓扑排序,裸的,水的. 第一发:题读错,输出错,输入错,到处错 \(\longrightarrow\) 40pts (excuse me ?) 第二发:漏了输入层特判 \(\longrightarro ...
- 线程重用问题--ThreadLocal数据错乱
前言 复现Java业务开发常见错误100例--1 项目完整代码:Github地址 知识点回顾: ThreadLocal的定义和使用: ThreadLocal概念以及使用场景 配置文件的读取: 获取配置 ...
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- spring-aop-事务-注解开发-代理
1.spring + mybatis: Aop流程: 提前定义好几个用于Aop的类 前置通知:新建MyBeForeAdvice类 实现 MethodBeforeAdvice,并实现其方法 后置通知:新 ...
- ubuntu生成ssh_key
ssh-keygen cat ~/.ssh/id_rsa.pub