1. /*
  2. 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化
  3. */
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<string>
  7. #include<cstring>
  8. #include<algorithm>
  9. #include<cmath>
  10. #include<vector>
  11. #define ll long long
  12. #define fo(i,l,r) for(int i = l;i <= r;i++)
  13. #define fd(i,l,r) for(int i = r;i >= l;i--)
  14. using namespace std;
  15. const int maxn = ;
  16. ll read(){
  17. ll x=,f=;
  18. char ch=getchar();
  19. while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
  20. while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
  21. return x*f;
  22. }
  23. int n;
  24. ll dp[maxn][maxn],dp2[maxn][maxn],val[maxn],sum[maxn];
  25. int main(){
  26. freopen("merge.in","r",stdin);
  27. freopen("merge.out","w",stdout);
  28. n = read();
  29. memset(dp,/,sizeof(dp));
  30. memset(dp2,/,sizeof(dp2));
  31. fo(i,,n) val[i] = read();
  32. fo(i,,n){
  33. dp[i][i] dp2[i][i] = ;
  34. sum[i] = sum[i-] + val[i];
  35. }
  36. for(int l = ;l <= n;l+=){
  37. for(int i = ;i + l - <= n;i++){
  38. int j = i + l - ;
  39. for(int k1 = i;k1 <= j;k1 += ){
  40. for(int k2 = k1 + ;k2 <= j;k2 += ){
  41. dp[i][j] = min(dp[i][j],dp[i][k1] + dp[k1+][k2] + dp[k2+][j] + sum[j] - sum[i-]);
  42. }
  43. }
  44. }
  45. }
  46. cout<<dp[][n];
  47. return ;
  48. }
  49.  
  50. #include<iostream>
  51. #include<algorithm>
  52. #include<cstdio>
  53. #include<cstring>
  54. #include<cmath>
  55. #include<cstdlib>
  56. using namespace std;
  57. typedef long long ll;
  58. typedef long double ld;
  59. typedef pair<int,int> pr;
  60. const double pi=acos(-);
  61. #define rep(i,a,n) for(int i=a;i<=n;i++)
  62. #define per(i,n,a) for(int i=n;i>=a;i--)
  63. #define Rep(i,u) for(int i=head[u];i;i=Next[i])
  64. #define clr(a) memset(a,0,sizeof a)
  65. #define pb push_back
  66. #define mp make_pair
  67. #define putk() putchar(' ')
  68. ld eps=1e-;
  69. ll pp=;
  70. ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
  71. ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
  72. ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
  73. ll read(){
  74. ll ans=;
  75. char last=' ',ch=getchar();
  76. while(ch<'' || ch>'')last=ch,ch=getchar();
  77. while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
  78. if(last=='-')ans=-ans;
  79. return ans;
  80. }
  81. void put(ll a){
  82. if(a<)putchar('-'),a=-a;
  83. int top=,q[];
  84. while(a)q[++top]=a%,a/=;
  85. top=max(top,);
  86. while(top--)putchar(''+q[top+]);
  87. }
  88. //head
  89. #define INF 1000000000
  90. #define N 410
  91. int n,f1[N][N],f2[N][N],a[N];
  92. int main(){
  93. freopen("merge.in","r",stdin);
  94. freopen("merge.out","w",stdout);
  95. n=read();
  96. rep(i,,n)
  97. rep(j,,n)f1[i][j]=f2[i][j]=INF;
  98. rep(i,,n)a[i]=a[i-]+read();
  99. rep(i,,n)f2[i][i]=;
  100. rep(i,,n-)f1[i][i+]=a[i+]-a[i-];
  101. rep(len,,n)
  102. rep(i,,n-len+){
  103. int j=i+len-;
  104. rep(k,i,j-)f2[i][j]=min(f2[i][j],f1[i][k]+f2[k+][j]+a[j]-a[k]);
  105. rep(k,i,j-)f1[i][j]=min(f1[i][j],f2[i][k]+f2[k+][j]+a[j]-a[i-]);
  106. }
  107. cout<<f2[][n]<<endl;
  108. return ;
  109. }

清北学堂模拟赛day7 石子合并加强版的更多相关文章

  1. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  2. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  3. 清北学堂模拟赛d1t6 或和异或(xor)

    题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...

  4. 清北学堂模拟赛d4t5 b

    分析:一眼树形dp题,就是不会写QAQ.树形dp嘛,定义状态肯定有一维是以i为根的子树,其实这道题只需要这一维就可以了.设f[i]为以i为根的子树中的权值和.先处理子树内部的情况,用一个数组son[i ...

  5. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  6. 清北学堂模拟赛d3t6 c

    分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...

  7. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  8. 清北学堂模拟赛d1t2 火柴棒 (stick)

    题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...

  9. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

随机推荐

  1. Redmine 插件安装

    将对应的插件都复制进redmine的plugins 安装对应所需要的GEMS bundle install --without development test rmagick 执行插件合并 bund ...

  2. Linux服务器磁盘扩展和oracle表空间文件迁移操作记录

    1.环境介绍 服务器硬件:Dell R710 服务器OS:红帽子Linux   RHEL4.8 数据库:Oracle 10g 2.出现的问题 因为数据表每天有上百万的数据写入表,加上建立索引,导致表空 ...

  3. CF444C. DZY Loves Colors[线段树 区间]

    C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. 洛谷11月月赛round.2

    P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...

  5. 常用IDEA快捷键

    [转]常用IDEA快捷键 阿烈的博客 2013-06-29 72 阅读   最近已经从eclipse转到IntelliJ IDEA,IDEA用起来太顺手了,许多功能正合我意. 看到时光印记写的一篇&l ...

  6. [No000069]Javascript中this关键字详解

    Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...

  7. HAOI2015 泛做

    T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...

  8. RAID级别

    raid磁盘阵列,我们一般使用RAID 5,挂载单独硬盘测试读写速度,一般使用RAID0.

  9. JS禁止选中文本方法

    if (typeof(element.onselectstart) != "undefined") { // IE下禁止元素被选取 element.onselectstart = ...

  10. 微信小程序之生命周期(三)

    [未经作者本人同意,请勿以任何形式转载] 上一篇介绍微信小程序开发工具使用和项目目录结构. 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 通俗的讲,生命周期就是指一个对象的生老病死. 从软件的 ...