http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021

设sum[i][j]为从第i为开始,长度为j的区间的值得和。dp[i][j]为从i开始长度为j的区间的最优值。

那么我们分析一下情况:

  dp[1][1] = 0,dp[2][1] = 0,dp[3][1] = 0,dp[4][1] = 0;(初始化)

两两合并的过程:

  dp[1][2] = dp[1][1] + dp[2][1] + sum[1][2];

  dp[2][2] = dp[2][1] + dp[3][1] + sum[2][2];

  dp[3][2] = dp[3][1] + dp[4][1] + sum[3][2];

  dp[4][2] = dp[4][1] + dp[5][1] + sum[4][2];

三个合并的过程:

  dp[1][3] = min(dp[1][1]+dp[2][2],dp[1][2]+dp[3][1])+sum[1][3];

  dp[2][3] = min(dp[2][1]+dp[3][2],dp[2][2]+dp[4][1])+sum[2][3];

以此类推,最后得到dp[1][n]。

可以发现每次用到的值都可以有前一阶段得到。

  1. #include<map>
  2. #include<queue>
  3. #include<stack>
  4. #include<cmath>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<iostream>
  8. #include<algorithm>
  9. #define INF 99999999
  10. #define mod 1000000007
  11. #define ll __int64
  12. #define lson l,m,rt<<1
  13. #define rson m+1,r,rt<<1|1
  14. #define key_value ch[ch[root][1]][0]
  15. using namespace std;
  16. const int MAXN = ;
  17. int dp[MAXN][MAXN],sum[MAXN][MAXN],a[MAXN];
  18. int main()
  19. {
  20. int n;
  21. while(cin >>n){
  22. memset(sum,,sizeof(sum));
  23. for(int i = ; i <= n; i++){
  24. cin >>a[i];
  25. }
  26. memset(sum,,sizeof(sum));//从i开始长为j的区间的和
  27. for(int i = ; i <= n; i++){
  28. for(int j = ; j <= n; j++){
  29. sum[i][j] = sum[i][j-] + a[j+i-];
  30. }
  31. }
  32.  
  33. memset(dp,,sizeof(dp));
  34. for(int len = ; len <= n; len++){//区间长度
  35. for(int i = ; i <= n - len + ; i++){//第i个开始
  36. dp[i][len] = INF;
  37. for(int j = ; j < len; j++){//长度
  38. dp[i][len] = min(dp[i][len],dp[i][j] + dp[i+j][len-j] + sum[i][len]);
  39. }
  40. }
  41. }
  42. cout<<dp[][n]<<endl;
  43. }
  44. }

石子合并 区间DP (经典)的更多相关文章

  1. 洛谷 P1880 [NOI1995] 石子合并(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...

  2. 石子合并 区间dp模板

    题意:中文题 Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合 ...

  3. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  4. 石子合并 区间DP模板题

    题目链接:https://vjudge.net/problem/51Nod-1021 题意 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石 ...

  5. 洛谷 P1080 石子合并 ( 区间DP )

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

  6. 石子合并——区间dp

    石子合并(3种变形) <1> 题目: 有N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分, ...

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

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

  8. P1880 [NOI1995]石子合并 区间dp+拆环成链

    思路 :一道经典的区间dp  唯一不同的时候 终点和起点相连  所以要拆环成链  只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...

  9. HRBUST - 1818 石子合并 区间dp入门

    有点理解了进阶指南上说的”阶段,状态和决策“ /* 区间dp的基础题: 以区间长度[2,n]为阶段,枚举该长度的区间,状态dp[l][r]表示合并区间[l,r]的最小费用 状态转移方程dp[l][r] ...

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

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

随机推荐

  1. Jetson TK1刷机+配置Mini PCI-e无线网卡

    最近买了台4K电视,觉得可以当显示器用,但没主机,不知怎的想到了Jetson TK1,于是一冲动买了.因为没网线,而Jetson TK1没有无线网卡,所以也折腾了一番,记录一下,给万一也有像我一样没有 ...

  2. 通过JDBC进行简单的增删改查(二)

    本章笔记更易理解和学习,也是我第一次初学的笔记. package javastudy; import java.sql.Connection; import java.sql.DriverManage ...

  3. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  4. C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字

            /// 去掉字符串中的数字           public static string RemoveNumber(string key)           {            ...

  5. 013医疗项目-模块一:加入工具类ResultUtil

    这篇文章要做的就是优化,封装.把之前的代码尽量封装进类,并且不要硬编码. 在UserServiceimpl中的insertSysuser()函数之前是这么写的: ResultInfo resultIn ...

  6. 【WPF】Winform调用WPF窗体注意事项

     1.需要添加一些引用 2.调用处使用如下方法进行调用 Window win= new Window(); ElementHost.EnableModelessKeyboardInterop(win) ...

  7. 转载:关于 WebBrowser只对浏览器外应用程序以及在Internet Explorer 中以提升权限运行的应用程序启用

    我是根据很多大神写的博客,以及我自己在做项目的时候做的关于提升Silverlight 中WebBrowser 提升信任的问题的总结: 1)选中Silverlight主程序,右键“属性”---“Sliv ...

  8. cisco交换技术list

  9. IOS开发之——类似微信摇一摇的功能实现

    首先,一直以为摇一摇的功能实现好高大上,结果百度了.我自己也模仿写了一个demo.主要代码如下: 新建一个项目,名字为AnimationShake. 主要代码: - (void)motionBegan ...

  10. MMDrawerController第三方库的使用(根据导航item+滚动条progressView实现的手势滑动切换视图的)

    https://github.com/mutualmobile/MMDrawerController MMDrawerControlleris边抽屉导航容器视图控制器用来支持越来越多的应用程序利用抽屉 ...