石子合并石子合并石子合并

Description

在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。

Input

每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。

Output

对于每组数据输出一个正整数,即最小得分

Sample Input

7

13

7

8

16

21

4

18

Sample Output

239

说明:

本题之前用两个方法做过,这次用三个方法做


方法一方法一方法一

先枚举前面的数(i),再枚举后面的数(j),最后枚举中间的分割线(c)(三重循环) 用i到c-1之间的数加上c到j的数再加上之前的得分,再将所有的值去最小。(计算一个数到另一个数可以用前缀和搞定)

状态转移方程:

f[i][j]=min(f[i][j],f[i][c−1]+f[c][j]+s[j]−s[i−1])f[i][j]=min(f[i][j],f[i][c-1]+f[c][j]+s[j]-s[i-1])f[i][j]=min(f[i][j],f[i][c−1]+f[c][j]+s[j]−s[i−1])

f[i][j]表示合成i到j的最小得分

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,s[101],f[101][101],x;
int main()
{memset(f,127/3,sizeof(f));//因为要去最小的,所以要先赋一个大的值scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&x);s[i]=s[i-1]+x;//前缀和f[i][i]=0;//清零单个的}for (int i=n-1;i>=1;i--)for (int j=i+1;j<=n;j++)for (int c=i+1;c<=j;c++)f[i][j]=min(f[i][j],f[i][c-1]+f[c][j]+s[j]-s[i-1]);printf("%d",f[1][n]);
}

方法二方法二方法二

先枚举长度(k),再枚举前面的数(i),最后枚举分割线(c),然后后面的数(j)就可以求出来了:

j=i+k−1j=i+k-1j=i+k−1

之后的步骤和方法一 几乎 完全一样

状态转移方程:

f[i][j]=min(f[i][j],f[i][c−1]+f[c][j]+s[j]−s[i−1])f[i][j]=min(f[i][j],f[i][c-1]+f[c][j]+s[j]-s[i-1])f[i][j]=min(f[i][j],f[i][c−1]+f[c][j]+s[j]−s[i−1])

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,x,j,s[101],f[101][101];
int main()
{memset(f,127/3,sizeof(f));scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&x);s[i]=s[i-1]+x;//前缀和f[i][i]=0;}for (int k=2;k<=n;k++)//复制长度for (int i=1;i<=n-k+1;i++){j=i+k-1;//求出后面的数for (int c=i+1;c<=j;c++)f[i][j]=min(f[i][j],f[i][c-1]+f[c][j]+s[j]-s[i-1]);}printf("%d",f[1][n]);
}


方法三方法三方法三

方法与前面的一样,但是f[i][j]表示的是从第i个开始后面的j个数,导致了写法不同

动态转移方程

f[i][j]=min(f[i][j],f[i][c]+f[i+c][j−c]+s[i+j−1]−s[i−1])f[i][j]=min(f[i][j],f[i][c]+f[i+c][j-c]+s[i+j-1]-s[i-1])f[i][j]=min(f[i][j],f[i][c]+f[i+c][j−c]+s[i+j−1]−s[i−1])

i+c是第二段的开头,j-c是的二段的长度

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,x,s[101],f[101][101];
int main()
{memset(f,127/3,sizeof(f));scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&x);s[i]=s[i-1]+x;//前缀和f[i][1]=0;}for (int j=2;j<=n;j++)//枚举长度,但表达不一样for (int i=1;i<=n-j+1;i++)//枚举前面的数for (int c=1;c<j;c++)//枚举分割线f[i][j]=min(f[i][j],f[i][c]+f[i+c][j-c]+s[i+j-1]-s[i-1]);printf("%d",f[1][n]);
}

【动态规划】石子合并 (ssl 2863)相关推荐

  1. 算法分析 | 动态规划 | 石子合并问题

    一.问题描述 在一条直线上有n堆石子, 要求每次将相邻的两堆石子合成一堆,花费=两堆石子的总数 求最省总花费. 因为存在相邻的限制条件,不能使用贪心算法将每次最小的2堆合起来.遂使用动态规划 二.代码 ...

  2. 算法设计与分析——动态规划——石子合并问题

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

  3. 【动态规划】 石子合并问题(环形) (ssl 1597)

    石子合并问题石子合并问题石子合并问题 Description 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该 ...

  4. 【SSL】1597石子合并问题(环形)

    [SSL]1597石子合并问题(环形) Time Limit:1000MS Memory Limit:65536K Description 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并 ...

  5. 石子合并(动态规划DP)

    时限: 1000ms 内存限制:10000K  总时限:3000ms 描述: 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成 ...

  6. 动态规划经典题之石子合并

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

  7. 石子合并问题java_动态规划求石子合并问题

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

  8. 租用游艇问题 石子合并问题 动态规划实验

    实验名称:动态规划 一.实验预习 1.实验目的 1. 理解并掌握动态规划方法的设计思想: 2. 提高应用动态规划方法解决问题和设计算法的能力: 3. 通过编程实现租用游艇问题和石子合并问题,进一步理解 ...

  9. 石子合并 动态规划(直线型)

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

最新文章

  1. Servlet 第六课: Session的使用
  2. Python 编程快速上手 第十五章 保持时间,计划任务和启动程序
  3. 管理Exchange服务器
  4. 【NLP】大模型时代,我们真的不再需要分词了吗?
  5. java工程加包_Java工程中添加依赖jar包不起作用问题总结
  6. XML配置文件中的Spring配置文件
  7. java volatile关键字使用
  8. php6 xml,thinkphp6 常用方法文档
  9. 《福州往事》(抒情散文)
  10. 「课程」行为经济学-北京大学光华管理学院
  11. hcia是什么等级的证书_华为hcia是什么等级的证书
  12. CSS 只选中第一个和最后一个元素
  13. 我国东北虎种群增长迅速 但近交风险不容忽视
  14. macOS 10.13 High Sierra的新增功能,现已上市
  15. pk 与fk mysql_什么是MySQL FK的正确命名约定?
  16. Simulink中Delay模块的使用
  17. html5魔塔编辑器安卓版,Mota: 纪元魔塔前传。童年魔塔记忆。使用手机编写的5000行代码...
  18. 关于DNS攻击那点事儿~ (DNS劫持 vs ISP劫持)
  19. TDD和FDD之间的区别(详细)
  20. 大数据浪潮下,企业财务人员应如何提升数据分析能力?

热门文章

  1. linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
  2. oracle symonym_Oracle的同义词(synonyms)
  3. 一文了解贪心算法和回溯算法在前端中的应用
  4. [JavaWeb-JavaScript]JavaScript_Math数学对象
  5. 最长公共子序列-dp
  6. 二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现
  7. 蓝桥杯 左baby右兄弟
  8. P3293 [SCOI2016]美味
  9. Product 1 Modulo N CodeForces - 1514C
  10. 第1节 连通性强连通、割点和桥 例题