动态规划石子合并问题

问题描述:在一个圆形操场的四周摆放着n堆石子,现要将石子有次序的合并成一堆。每次只能选择相邻的2堆石子合并成新的一堆,并将新的一对石子数记为该次合并的得分。
求 最小值和最大值
in:
4
4 4 5 9


out:
43
54


1.首先考虑 石子是环形摆放
所以可以 将数组存放成 4 4 5 9 4 4 5
2.然后从局部最优求到全局最优其中采用2个数组来储存 运算过程用到的数据
m**用来储存合并后石子的数量
result**用来储存得分

void maxdynamic(int *p, int n, int **m,int**result) {//n为数组个数
for (int i = 0; i < 2*n-1; i++) {
    m[i][i] = p[i];//m存放没堆石头的个数
    result[i][i] = 0;//存放分数
}
for (int r = 2; r <= n*2-r; r++)//这里 r<n*2-r 可以改成 r<n 减少运算次数
    for (int i = 0; i <n; i++) {
        int j = i + r - 1;//左值:i 右值:j 宽度:r
        for (int k = i; k < j; k++) {//假设k为断开的地方,计算result 和m
            int t = m[i][k] + m[k + 1][j]+result[i][k]+result[k+1][j];//左边+右边+之前分数
          
  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值