算法提高 合并石子(DP)
2024-09-26 11:22:58
问题描述
在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。
输入格式
输入第一行包含一个整数n,表示石子的堆数。
接下来一行,包含n个整数,按顺序给出每堆石子的大小 。
接下来一行,包含n个整数,按顺序给出每堆石子的大小 。
输出格式
输出一个整数,表示合并的最小花费。
样例输入
5
1 2 3 4 5
1 2 3 4 5
样例输出
33
数据规模和约定
1<=n<=1000, 每堆石子至少1颗,最多10000颗。
#include<stdio.h>
#include<stdlib.h>
#define INIF 0x3f3f3f3f
int N;
int dp[][] = {};
int sum[][];
int num[];
void minsz()
{
int i, j, k, t, len, minx;
for(i = ; i <= N; i++)
{
sum[i][i] = num[i];
for(j = i + ; j <= N; j++)
{
sum[i][j] = sum[i][j-] + num[j];//计算堆到堆的距离
}
}
for(j = ; j <= N; j++)
{
for(i = j-; i > ; i--)
{
minx = INIF;
dp[i][j] = INIF;
for(k = i; k < j; k++)
{
t = dp[i][k] + dp[k+][j] + sum[i][j];
if(t < minx)
minx = t;
}
dp[i][j] = minx;
}
}
printf("%d\n", dp[][N]);
} int main()
{
int i;
scanf("%d", &N);
for(i = ; i <= N; i++)
{
scanf("%d", &num[i]);
}
minsz();
return ;
}
最新文章
- js之如何获取css样式
- EPUBBuilder编辑器新版
- gdb调试小结
- ASP.NET中使用代码来进行备份和还原数据库
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)
- 《ASP.NET1200例》高亮显示ListView中的数据行并自动切换图片
- F5 负载均衡
- Swift—静态属性- 备
- 菜单之一:Menu基础内容
- File对象的常用方法
- jQuery 学习笔记(三)——事件与应用
- Nginx--服务部署、基于域名的虚拟主机配置
- BackgroundWorker 组件
- docker swarm:Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
- mybatis:数据持久层框架
- react-native中的style
- awk入门【转】
- 【AI】基本概念-准确率、精准率、召回率的理解
- Java中的权限修饰符private、protected、public
- BP浅谈