51nod1021 石子归并
来源:互联网 发布:vs 变量已被优化掉 编辑:程序博客网 时间:2024/06/03 04:09
1021 石子归并
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注
N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
例如: 1 2 3 4,有不少合并方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
括号里面为总代价可以看出,第一种方法的代价最低,现在给出n堆石子的数量,计算最小合并代价。
Input
第1行:N(2 <= N <= 100)
第2 - N + 1:N堆石子的数量(1 <= A[i] <= 10000)
Output
输出最小合并代价
Input示例
4
1
2
3
4
Output示例
19
/** *dp[i][j]表示从第i个石头到第j个石头花费的最小代价 *dp[i][j] = min(dp[i][k]+dp[k+1][j] (k>=i && k<j))+sum(i,j); */#include <iostream>#include <stdio.h>using namespace std;int a[123];int dp[123][123];int sum[123];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sum[1]=a[1]; for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; } for(int d=1;d<n;d++)//枚举间距 { for(int start=1;start<n;start++)//枚举起点 { int mins=INT_MAX; int end=start+d; for(int k=start;k<min(end,n);k++) // 枚举k值 { mins=min(mins,dp[start][k]+dp[k+1][end]+sum[end]-sum[start-1]); } dp[start][end]=mins; } } printf("%d\n",dp[1][n]); return 0;}
0 0
- 51nod1021:石子归并
- 51nod1021 石子归并
- 51nod1021石子归并(区间dp)
- 51nod 石子归并
- 51nod 石子归并 (dp)
- 51nod 1021 石子归并
- 51nod 1021 石子归并
- 51Nod 1021 石子归并
- 51nod 1021 石子归并
- 51NOD 1021 石子归并
- 51nod 1021 石子归并
- 51 Nod 1021 石子归并
- 51nod 1021 石子归并
- 1021 石子归并-51Nod
- 【51nod】1021 石子归并
- 51nod 1021 石子归并
- 51Nod 1021 石子归并
- 51Nod1022 石子归并V2
- cocos 3.14 eclpise 环境配置 打包
- ASP.Net学习笔记013--ViewState初探2
- 分库分表的几种常见形式以及可能遇到的难题
- html
- MySQL命令整理
- 51nod1021 石子归并
- Activity starting window and how to speed up activity starting (Android 7.0)
- 剑指offer-12.数值的整数次方
- 一、二级路由的配置
- 《剑指offer》003-二维数组中的查找(更接近笔试--涉及到输入函数)
- Oracle SQL语句总结
- 《TCP/IP详解卷一:协议》学习笔记七
- POJ
- Mnesia动态添加节点杂记