看了下感觉区间dp就是一种套路,直接上的板子代码就好了。

基础题ac代码:石子归并

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. int dir[][]={{,},{,},{,},{,-},{-,},{-,-},{,-},{-,}};
  6. #define pi acos(-1)
  7. #define ls rt<<1
  8. #define rs rt<<1|1
  9. #define me0(s) memset(s,0,sizeof(s))
  10. #define me1(s) memset(s,1,sizeof(s))
  11. #define mef(s) memset(s,-1,sizeof(s))
  12. #define meinf(s) memset(s,inf,sizeof(s))
  13. #define inf 0x3f3f3f
  14. const int N=1e6+;
  15. inline int read() {
  16. char c=getchar(); int x=, f=;
  17. while(c<''|c>'') {if(c=='-') f=-;c=getchar();}
  18. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  19. return x*f;
  20. }
  21. ll exgcd(ll a,ll b){
  22. if(b==) return a;
  23. exgcd(b,a%b);
  24. }
  25. ll q_pow(ll a,ll b,ll mod){
  26. ll anss=;
  27. while(b){
  28. if(b&) anss=anss*a%mod;
  29. a=a*a%mod;
  30. b>>=;
  31. }
  32. return anss;
  33. }
  34. ll q_mul(ll a,ll b,ll mod){
  35. ll anss=;
  36. while(b){
  37. if(b&) anss=(anss+a)%mod;
  38. a=(a+a)%mod;
  39. b>>=;
  40. }
  41. return anss;
  42. }
  43. int dp[][];
  44. int sum[];
  45. int stone[];
  46. int main(int argc, char * argv[]){
  47. ios::sync_with_stdio(false);
  48. int n;
  49. cin>>n;
  50. me0(sum);
  51. meinf(dp);
  52. for(int i=;i<=n;i++){
  53. cin>>stone[i];
  54. sum[i]=sum[i-]+stone[i];
  55. dp[i][i]=;
  56. }
  57. for(int len=;len<=n;len++){//枚举长度
  58. for(int j=;j+len<=n+;j++){//枚举起点,ends<=n
  59. int ends=j+len-;
  60. for(int i=j;i<ends;i++){//枚举分割点,更新小区间最优解
  61. dp[j][ends]=min(dp[j][ends],dp[j][i]+dp[i+][ends]+sum[ends]-sum[j-]);
  62. }
  63. }
  64. }
  65. cout<<dp[][n]<<endl;
  66. return ;
  67. }

但是这样一眼就看出来了复杂度是n3的复杂度,这个复杂度数据稍稍大点就爆了,所以还是要用到四边形不等式优化。

但是由于个人感觉很复杂,看了不是很懂,直接贴个链接:四边形不等式优化

优化过的AC的代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. int dir[][]={{,},{,},{,},{,-},{-,},{-,-},{,-},{-,}};
  6. #define pi acos(-1)
  7. #define ls rt<<1
  8. #define rs rt<<1|1
  9. #define me0(s) memset(s,0,sizeof(s))
  10. #define me1(s) memset(s,1,sizeof(s))
  11. #define mef(s) memset(s,-1,sizeof(s))
  12. #define meinf(s) memset(s,inf,sizeof(s))
  13. #define inf 0x3f3f3f
  14. const int N=1e6+;
  15. inline int read() {
  16. char c=getchar(); int x=, f=;
  17. while(c<''|c>'') {if(c=='-') f=-;c=getchar();}
  18. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  19. return x*f;
  20. }
  21. ll exgcd(ll a,ll b){
  22. if(b==) return a;
  23. exgcd(b,a%b);
  24. }
  25. ll q_pow(ll a,ll b,ll mod){
  26. ll anss=;
  27. while(b){
  28. if(b&) anss=anss*a%mod;
  29. a=a*a%mod;
  30. b>>=;
  31. }
  32. return anss;
  33. }
  34. ll q_mul(ll a,ll b,ll mod){
  35. ll anss=;
  36. while(b){
  37. if(b&) anss=(anss+a)%mod;
  38. a=(a+a)%mod;
  39. b>>=;
  40. }
  41. return anss;
  42. }
  43. int dp[][];
  44. int sum[];
  45. int stone[];
  46. int main(int argc, char * argv[]){
  47. ios::sync_with_stdio(false);
  48. int n;
  49. cin>>n;
  50. me0(sum);
  51. meinf(dp);
  52. int s[][];
  53. for(int i=;i<=n;i++){
  54. cin>>stone[i];
  55. sum[i]=sum[i-]+stone[i];
  56. dp[i][i]=;
  57. s[i][i]=i;
  58. }
  59. for(int len=;len<=n;len++){//枚举长度
  60. for(int j=;j+len<=n+;j++){//枚举起点,ends<=n
  61. int ends=j+len-;
  62. for(int k=s[j][ends-];k<=s[j+][ends];k++){
  63. if(dp[j][ends]>dp[j][k]+dp[k+][ends]+sum[ends]-sum[j-]){
  64. dp[j][ends]=dp[j][k]+dp[k+][ends]+sum[ends]-sum[j-];
  65. s[j][ends]=k;
  66. }
  67. }
  68. }
  69. }
  70. cout<<dp[][n]<<endl;
  71. return ;
  72. }

区间dp及优化的更多相关文章

  1. HDU3480_区间DP平行四边形优化

    HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前  i  个节点被分为  j  个区间所取得的最优值的情况 cost[i][j]表示从i ...

  2. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  3. codeforces 1101F Trucks and Cities 区间dp+单调优化 好题

    题目传送门 题意简述:(来自洛谷) 有n个城市坐落在一条数轴上,第ii个城市位于位置ai​. 城市之间有m辆卡车穿行.每辆卡车有四个参数:si​为起点编号,fi​为终点编号,ci​表示每行驶1个单位长 ...

  4. UVA - 1632 Alibaba (区间dp+常数优化)

    题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...

  5. 蓝桥杯:合并石子(区间DP+平行四边形优化)

    http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了 ...

  6. 51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)

    题意:就是求石子归并. 题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化. 就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四 ...

  7. 51Nod 1022 石子归并 V2(区间DP+四边形优化)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...

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

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

  9. hdu3516 Tree Construction (区间dp+四边形优化)

    构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...

随机推荐

  1. zookeeper3台机器集群环境的搭建

    三台机器zookeeper的集群环境搭建 Zookeeper 集群搭建指的是 ZooKeeper 分布式模式安装. 通常由 2n+1台 servers 组成. 这是因为为了保证 Leader 选举(基 ...

  2. NX二次开发-UFUN多按钮模态对话框UF_UI_message_dialog

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); //多按钮模态对话框 ; char title_ ...

  3. CSS3:CSS3 圆角

    ylbtech-CSS3:CSS3 圆角 1.返回顶部 1. CSS3 圆角 CSS3 圆角 使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". C ...

  4. iOS开发UITouch触摸API简介

    1.UITouch简介 当用户触摸屏幕时,会创建一个UITouch对象: UITouch的作用保存着触摸相关的信息,比如触摸的位置.时间.阶段等: 当从开始到结束,系统会更新UITouch对象,结束时 ...

  5. tensorflow run()和 eval()

    eval()只能用于tf.Tensor类对象,也就是有输出的Operation.对于没有输出的Operation, 可以用.run()或者Session.run() 所以我们训练的时候,对于优化器只能 ...

  6. log4j架构

    Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...

  7. NodeJS学习笔记之Connect中间件模块(二)

    一,开篇分析 大家好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也是出于本人的兴趣 ...

  8. 关于ctype.h头文件使用说明

    ctype.h里的函数概况: 1.字符测试函数 (1)函数原型均为 int isXXX( int ch) (2)参数为int,任何参数均被转换为整形 (3)只能处理[0,127]之间的值 2.字符映射 ...

  9. Spring MVC @RequestMapping注解详解(2)

    @RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...

  10. sys_call_table HOOK

    sys_call_table 这个东西,其实和 Windows 下的 SSDT 表,在功能上完全相同. 前一阵子学Linux驱动,遇到了这个系统调用表,然后我就想到Windows的SSDT表,既然SS ...