时间限制:2.0s 内存限制:256.0MB
提交此题
问题描述
  在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。
输入格式
  输入第一行包含一个整数n,表示石子的堆数。
  接下来一行,包含n个整数,按顺序给出每堆石子的大小 。
输出格式
  输出一个整数,表示合并的最小花费。
样例输入
5
1 2 3 4 5
样例输出
33
数据规模和约定
  1<=n<=1000, 每堆石子至少1颗,最多10000颗。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
typedef long long ll;
const int INF=0x3f3f3f3f;
const double PI=3.1415926;
const int N=1e3+5;
int sum[N],dp[N][N];
/**
思路:贪心法只是局部最优, (区间dp)全局最优 通过局部最优求解
dp[i][j]=    0                                       ; i = j时min(dp[j][j],dp[i][k]+dp[k+1][j) + (sum[j] - sum[i-1]); i != j时
**/
int main()
{int n,x;while(~scanf("%d",&n)){sum[0]=0;rep(i,1,n+1){scanf("%d",&x);sum[i]=sum[i-1]+x;}for(int R=2; R<=n; R++)///求区间长度R的最小值{for(int i=1; i<=n-R+1; i++)///枚举区间长度的开头的下标{int j=i+R-1;///第j堆的下标dp[i][j]=INF;for(int k=i; k<j; k++)///枚举合并这段区间以前的最小花费{if(dp[i][j]>dp[i][k]+dp[k+1][j])dp[i][j]=dp[i][k]+dp[k+1][j];}dp[i][j]+=(sum[j]-sum[i-1]);///放在循环内部会TLE}}printf("%d\n",dp[1][n]);}return 0;
}

四边形不等式优化:
优化条件参考:参考

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
typedef long long ll;
const int INF=0x3f3f3f3f;
const double PI=3.1415926;
const int N=1e3+5;
int sum[N],dp[N][N],p[N][N];
/**
思路:贪心法只是局部最优, (区间dp)全局最优 通过局部最优求解
dp[i][j]=    0                                       ; i = j时
         min(dp[j][j],dp[i][k]+dp[k+1][j) + (sum[j] - sum[i-1]); i != j时
**/
int main()
{
    int n,x;
    while(~scanf("%d",&n))
    {        sum[0]=0;
        rep(i,1,n+1)
        {            scanf("%d",&x);
            sum[i]=sum[i-1]+x;
            p[i][i]=i;
            dp[i][i]=0;
        }
        for(int R=2; R<=n; R++)///求区间长度R的最小值
        {            for(int i=1; i<=n-R+1; i++)///枚举区间长度的开头的下标
            {                int j=i+R-1;///第j堆的下标
                dp[i][j]=INF;
                for(int k=p[i][j-1]; k<=p[i+1][j]; k++)
                {                    if(dp[i][j]>dp[i][k]+dp[k+1][j])
                    {                        dp[i][j]=dp[i][k]+dp[k+1][j];
                        p[i][j]=k;
                    }
                }
                dp[i][j]+=(sum[j]-sum[i-1]);
            }
        }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}

算法提高 合并石子(区间dp,四边形不等式优化)相关推荐

  1. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  2. 【HDU 4905 多校联合】The Little Devil II【DP+四边形不等式优化】

    题意:给出一个数列,每次你可以选择相邻的两个数字进行求GCD,然后得到的数字把这两个数字替代,得到GCD的权值,求最后剩下一个数字后的最大的权值(权值初始是数列的和) 思路:定义dp[i][j]表示区 ...

  3. 合并石子 区间dp水题

    合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N- ...

  4. 线性DP 四边形不等式优化 hdu3506

    当函数w(i,j)满足 w(a,c)+w(b,d) <= w(b,c)+w(a,d) 且a<=b< c <=d 时,我们称w(i,j)满足四边形不等式..   当函数w(i, ...

  5. HDU-2829 Lawrence (DP+四边形不等式优化)

    题目大意:有n个敌方军火库呈直线排列,每个军火库有一个值vi,并且任意相邻的两个库之间都有通道相连.对于任意一条连起来的军火库链,它对我方的威胁可以用函数w(i,j)表示为:w(i,j)=vi*sum ...

  6. 算法提高 合并石子【动态规划】

    问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...

  7. 合并石子 四边形不等式优化

    题目描述 有一排石子,共n 堆.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分. ...

  8. 四边形不等式优化-石子合并

    四边形不等式优化 四边形不等式定义 在oi历程中,常有如下的dp转移方程 \(f(i,j)=min(f(i,k)+f(k+1,j)+w(i,j))\) \((i<=k<j)\) \(f(i ...

  9. 四边形不等式优化 --算法竞赛专题解析(10)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

  10. [转]四边形不等式优化dp(POJ1160)

    四边形不等式优化动态规划原理: 1.当决策代价函数w[i][j]满足w[i][j]+w[i'][j']<=w[I;][j]+w[i][j'](i<=i'<=j<=j')时,称w ...

最新文章

  1. [WIKIOI1298]凸包周长[裸凸包]
  2. mysql建表必须使用主键吗
  3. 实现option上下移动_用jQuery实现lt;selectgt;选项上下移动 - 不要哀求 学会争取 若是如此 终有所获 - ITeye博客...
  4. linux文件管理器添加项目,LXQt 0.14 发布,文件管理器添加拆分视图
  5. 剑指Offer - 面试题15. 二进制中1的个数(位运算)
  6. 数学倒底有没有绝对的严格性和形式化?
  7. javascript 方法总结(Array篇)
  8. Telnet 详解 及命令使用
  9. 6月8日苹果正式发布iOS 15,亮度多多
  10. 机器学习、深度学习、自然语言处理、计算机视觉顶级期刊的论文资料分享(附CVPR2017-2019,ECCV 2018论文下载链接)
  11. 电脑重启桌面 计算机图标消失,电脑重启后计算机图标不见了怎么办
  12. Cocos Creator入职学习日记——篇1(KeyWord:艺术字、渐变色、透明过渡特效)
  13. Python 多张 Excel 合并为一张 Excel
  14. 热修复 原理与实现详解
  15. springcloud 加入spring session通过zuul请求session不一致问题
  16. Android AIDL 传递对象(Parceable),深度解读Netty
  17. Dell电脑Fn与功能键的切换
  18. 使用Nginx访问图片报404
  19. 谨慎调整内核参数:vm.min_free_kbytes
  20. Java 集合深入理解(13):Stack 栈

热门文章

  1. go每日新闻--2020-10-01
  2. 别管我,我要养生了,因为我老了
  3. ios开发--iOS APP安全策略之加固保护原理
  4. Hive中order by和sort by的区别?
  5. android之bugly崩溃日志过滤
  6. Outlook通讯簿未更新,联系人异常的解决方案
  7. 自动化测试 seleniumpython 定位方式(输入框+超链接+点击事件)
  8. VBA实现不同模板WORD表格内容的批量转移
  9. nexus创建maven私服本地无法访问
  10. Codeforces 382 B. Number Busters(数论推公式)