试题 算法提高 合并石子

试题 算法提高 合并石子(动态规划)


时间限制:2.0s 内存限制:256.0MB
问题描述
  在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。
输入格式
  输入第一行包含一个整数n,表示石子的堆数。
  接下来一行,包含n个整数,按顺序给出每堆石子的大小 。
输出格式
  输出一个整数,表示合并的最小花费。
样例输入
5
1 2 3 4 5
样例输出
33
数据规模和约定
  1<=n<=1000, 每堆石子至少1颗,最多10000颗。
思路:
题目意思就是在n堆石子中不断的合并相邻的石头直到合并成1堆,然后叫我们算出最小花费。题目的花费情况是合并的费用为两堆石子的总数,意思就是当我们合并1和2 那么花费就是3 合并的3和之前的3合并花费总和就是3+3+3=9还要加之前的花费。
那我们可以分解此题,假设我们有1个石头那花费是0,2个石头那么就是他们的总和,3个石头那我们怎么划分呢,我们可以把他分解出来 :
第一种
我们可以将前面(第1堆和第2堆合并的花费值+第3堆花费值)+他们3个石头的数量=总花费值 (因为花费值并没有把本身的石头值加到花费里面。)
第二种
(第2堆和第3堆合并的花费值+第1堆花费值)+他们3个石头的数量=总花费值 依次类推.....
那我们从上面可以知道可以用动态规划的方式完成。
我们可以先把第1堆到n的每个区域储存起来我存储到了ad列表中。我们在建立一个dp[j][j1]表示j-j1之间的最小花费。
我们建立2层for循环第一层表示长度 第二层表示当前开头的堆 那 堆尾=开头+长度
从上述可知我们需要把这n堆石子的可能性列出来。那我们就建立一个for 从j-j1 因为我们遍历的是当前的n堆的可能性,那么dp[j][k] 表示的是前面j-k的堆 后面那么就表示 dp[k+1][j1], 这就是我们合并所花费的值。并没有把本身的石头值加到花费里面。所以还要加ad[j1]-ad[j-1].
那么我们的转移方程就是:dp[j][k]+dp[k+1][j1]+ad[j1]-ad[j-1]
然后在和本身的数比较最小值:
min(dp[j][j1],dp[j][k]+dp[k+1][j1]+ad[j1]-ad[j-1]) 注意我是从1开始的。
程序:

n=int(input())
a=list(map(int,input().split()))
dp=[[999999999999 for i1 in range(n+5)] for i in range(n+5)]  #dp初始化
ad=[ 0 for i in range(1005)]
for i in range(1,n+1):
    ad[i]=ad[i-1]+a[i-1] #把第0堆到i的每个区域储存起来
    dp[i][i]=0   #1堆最小花费为0
for i in range(1,n+1):   #表示j+i之间的堆  可以说是当前的长度。
    for j in range(1,n-i+1):  #当前开头堆
        j1=i+j  #结尾堆
        for k in range(j,j1+1):  #把这n堆石子的可能性列出来
            dp[j][j1]=min(dp[j][j1],dp[j][k]+dp[k+1][j1]+ad[j1]-ad[j-1])
print(dp[1][n])

禁止转载。仅用于自己学习。对程序错误不负责。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 简介 区间dp,顾名思义就是在一段区间上进行动态规划。对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是...
    Steven1997阅读 6,501评论 0 2
  • 石子合并动态规划解决 在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆...
    Super_邓帅阅读 2,775评论 0 0
  • 断断续续磕动态规划已经好几周了,怎么讲,如果非要概括一下这两三周的成果的话,大概就是从入门到放弃……动态规划题虽然...
    锅锅Iris阅读 808评论 1 2
  • 题目链接 石子合并 这样的定义,最后区间的合并一定是 和 进行合并。正因为这一点,我们才能用DP做。 有限集。是有...
    StevenHD阅读 309评论 0 0
  • 题目描述:小Q和牛博士在玩一个石子合并的游戏,初始一共有n堆石子,每堆石子有w[i]个石子。小Q和牛博士他们需要对...
    Zy_0818阅读 473评论 0 3