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
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int maxx=;
const int INF=0x3f3f3f3f;
int n,num[maxx],dp[maxx][maxx],sum[maxx][maxx];
int main(){
while(~scanf("%d",&n)){
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
}
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
sum[i][j]=sum[i][j-]+num[j];
}
}
memset(dp,INF,sizeof(dp));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i>=j){
dp[i][j]=;
}
}
}
for(int i=;i<=n;i++){
for(int j=i-;j>=;j--){
for(int k=j;k<i;k++){
dp[j][i]=min(dp[j][i],dp[j][k]+dp[k+][i]+sum[j][i]);
}
}
}
printf("%d\n",dp[][n]);
}
return ;
}
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 
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 <= 1000)
第2 - N + 1:N堆石子的数量(1 <= A[i] <= 10000)
Output
输出最小合并代价
Input示例
4
1
2
3
4
Output示例
19
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<string.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath> using namespace std;
const int N=;
int n,f[N][N]={},a[N][N]={};
int s[N][N];
int main(){
memset(f,,sizeof(f));
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&a[i][i]);
a[n+i][n+i]=a[i][i];
}
for(int i=;i<n*;i++){
s[i][i]=i;
f[i][i]=;
}
for(int i=;i<n*-;i++){
for(int j=i+;j<n*-;j++){
a[i][j]=a[i][j-]+a[j][j];
}
}
for(int l=;l<n;l++){
for(int i=;i+l<n*-;i++){
int j=i+l;
for(int k=s[i][j-];k<=s[i+][j];k++){
if(f[i][j] > a[i][j]+f[i][k]+f[k+][j])
{
f[i][j] = a[i][j]+f[i][k]+f[k+][j];
s[i][j] = k;
}
}
}
}
int ans=f[][n-];
for(int i=;i<n;i++){
if(ans>f[i][i+n-]){
ans=f[i][i+n-];
}
}
printf("%d\n",ans);
return ; }
基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题
 
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 <= 50000)
第2 - N + 1:N堆石子的数量(1 <= A[i] <= 10000)
Output
输出最小合并代价
Input示例
4
1
2
3
4
Output示例
19
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int N = ; int stone[N];
long long n,t,ans; void combine(int k)
{
int tmp = stone[k] + stone[k-];
ans += tmp;
for(int i=k;i<t-;i++)
stone[i] = stone[i+];
t--;
int j = ;
for(j=k-;j> && stone[j-] < tmp;j--)
stone[j] = stone[j-];
stone[j] = tmp;
while(j >= && stone[j] >= stone[j-])
{
int d = t - j;
combine(j-);
j = t - d;
}
} int main()
{
while(scanf("%lld",&n)!=EOF)
{
if(n == ) break;
for(int i=;i<n;i++)
scanf("%d",stone+i);
t = ;
ans = ;
for(int i=;i<n;i++)
{
stone[t++] = stone[i];
while(t >= && stone[t-] <= stone[t-])
combine(t-);
}
while(t > ) combine(t-);
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. 常用聚类算法(一) DBSCAN算法
  2. event 内存泄漏
  3. emum类(2)
  4. C#登录窗口及验证(+SQL)
  5. 使用时间戳引入css、js文件
  6. 约束优化方法之拉格朗日乘子法与KKT条件
  7. WinPcap编程入门实践
  8. Java 保留两位小数
  9. Linux 下源码安装JDK
  10. IOS 轻量级数据持久化 DataLite
  11. leetcode[68] Climbing Stairs
  12. Entity Framework 学习中级篇4—存储过程(下)
  13. mysql安装使用----1 安装和启动
  14. MVC中@RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、Html.RenderAction的作用和区别
  15. [福大软工] W班 评测作业对应表
  16. Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
  17. git变慢的原因
  18. unsafe关键字
  19. DRM学习总结(1)--- DRM框架介绍
  20. hadoop开发环境

热门文章

  1. 学习python第十五天,面向对象
  2. 如何查询进程中占用CPU的线程
  3. 关于SSM框架项目中jsp页面EL表达式使用的一些疑问(一)
  4. Java-多线程与单例
  5. Linux 批量删除文件后缀
  6. 剑指Offer - 九度1503 - 二叉搜索树与双向链表
  7. 最短路径(Floyd法)
  8. 如何将现有的项目添加到远程的git库里面!
  9. 转:Redis设置认证密码 Redis使用认证密码登录 在Redis集群中使用认证密码
  10. Python网络编程(epoll内核监听,多任务多进程)