题意:有n个石堆排成环,每次能合并相邻的两堆石头变成新石堆,代价为新石堆石子数,问最少的总代价是多少

思路:先看没排成环之前怎么做:用dp[i][j]表示合并i到j所需的最小代价,那么dp[i][j]就是合并i~k、k+1~j的最小代价,即dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + w[i][j]])。

  1. for(int len = ; len <= n; len++){ //区间长度
  2.   for(int i = ; i + len - <= n; i++){ //起始位置
  3.     int j = i + len - ;  //末尾位置
  4.     for(int k = i; k <= j; k++){
  5.   if(dp[i][j] > dp[i][k] + dp[k + ][j] + w[i][j]){
  6.    dp[i][j] = dp[i][k] + dp[k + ][j] + w[i][j]];
  7. }
  8. }
  9. }
  10. }

合并石堆环是,只要把n首尾相接扩展到2n,就可以了。

这个dp还可以用四边形不等式优化

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. typedef long long ll;
  5. using namespace std;
  6. const int maxn = + ;
  7. const int MOD = 1e9 + ;
  8. const int INF = 0x3f3f3f3f;
  9. int a[maxn], dp[maxn << ][maxn << ], sum[maxn];
  10. int s[maxn << ][maxn << ]; //i到j的最佳分割点
  11. int main(){
  12. int n;
  13. while(~scanf("%d", &n)){
  14. sum[] = ;
  15. memset(dp, INF, sizeof(dp));
  16. for(int i = ; i <= n; i++){
  17. scanf("%d", &a[i]);
  18. a[i + n] = a[i];
  19. }
  20. for(int i = ; i <= * n; i++){
  21. s[i][i] = i;
  22. dp[i][i] = ;
  23. sum[i] = sum[i - ] + a[i];
  24. }
  25. for(int len = ; len <= n; len++){ //长度
  26. for(int i = ; i + len - <= * n; i++){ //起始位置
  27. int j = i + len - ;
  28. for(int k = s[i][j - ]; k <= s[i + ][j]; k++){
  29. if(dp[i][j] > dp[i][k] + dp[k + ][j] + sum[j] - sum[i - ]){
  30. dp[i][j] = dp[i][k] + dp[k + ][j] + sum[j] - sum[i - ];
  31. s[i][j] = k;
  32. }
  33. }
  34. }
  35. }
  36. int ans = INF;
  37. for(int i = ; i <= n; i++){
  38. ans = min(ans, dp[i][i + n - ]);
  39. }
  40. printf("%d\n", ans);
  41. }
  42. return ;
  43. }

HDU 3506 Monkey Party(区间DP)题解的更多相关文章

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

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

  2. HDU 1069 Monkey and Banana dp 题解

    HDU 1069 Monkey and Banana 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种 ...

  3. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

  4. HDU 5693 D Game 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...

  5. hdu 4597 Play Game 区间dp

    Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...

  6. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

  7. hdu 5693 && LightOj 1422 区间DP

    hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...

  8. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

  9. HDU - 3506 Monkey Party

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

  10. E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)

    题目大意:  值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...

随机推荐

  1. html5常用数学 公式的用法

    <script>        // alert(Math.PI);        // alert(Math.floor(3.16));    // var a=Math.ceil(3. ...

  2. Running tests on PyCharm using Robot Framework

    问题: I started using PyCharm with the robot framework, but i'm facing an issue. how can i run my test ...

  3. 动态创建 Plist 文件

    简介 Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.plist ,因此通常被称为 plist文件,文件是xml格式的. 写入plist文件 在 ...

  4. Hive中实现group concat功能(不用udf)

    在 Hive 中实现将一个字段的多条记录拼接成一个记录: hive> desc t; OK id string str string Time taken: 0.249 seconds hive ...

  5. crontab 在指定时间范围每隔2小时执行一次和指定时间执行实例

    crontab 在指定时间范围每隔2小时执行一次和指定时间执行,下面实例实现了:10-23点每两个小时执行一次,2点执行一次,分钟依次是1 2 3 ,没有24点的,晚上12点是0点注:*代表所有的取值 ...

  6. JustOj 1927: 回文串

    题目描述 回文串是从左到右或者从右到左读起来都一样的字符串,试编程判别一个字符串是否为回文串. 输入 输入一个字符串.串长度<255. 输出 判别输入的字符串是否为回文串,是输出"Y& ...

  7. android基本架构

    Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA ...

  8. Django后端项目---- rest framework(4)

    一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于lim ...

  9. java加载配置文件信息

    #基金数据存放根目录fund_save_root_path=E:/fundCrawling #龙虎榜数据存放根目录long_hu_root_path=E:/longHuCrawling #巨潮数据存放 ...

  10. 文件IO流

    //字节流读写含有中文的文本文件会出现问题,我在实践中居然没有检验出该问题,新人小菜,希望大家能指出: import java.io.FileInputStream; import java.io.F ...