博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
石子合并 (区间DP)
阅读量:6002 次
发布时间:2019-06-20

本文共 946 字,大约阅读时间需要 3 分钟。

 
一.试题

在一个园形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。规定

每次仅仅能选相邻的两堆合并成新的一堆,并将新的一堆的石子数。记为该次合并的得分。

编一程序。由文件读入堆数N及每堆的石子数(≤20)。

①选择一种合并石子的方案,使得做N-1次合并,得分的总和最小。

②选择一种合并石子的方案,使得做N-1次合并。得分的总和最大。


比如,所看到的的4堆石子,每堆石子数(从最上面的一堆数起。顺时针数)依

次为4594。则3次合并得分总和最小的方案:8+13+22=43

得分最大的方案为:14+18+22=54
 

#include
#include
#include
#include
#include
using namespace std;#define N 105//定义二维数组m[i][j]来记录i到j的合并过成中最少石子数目int solve_min(int *p,int n){ int i,j,k,r,sum; int m[N][N]; memset(m,-1,sizeof(m)); for(i=1; i<=n; i++) //当一个单独合并时,m[i][i]设为0,表示没有石子 m[i][i]=0; for(i=1; i
m[i][j]) m[i][j]=t; } } } return m[1][n];}int main(){ int i,j,k,n,stone[N]; while(scanf("%d",&n)!=-1) { for(i=1; i<=n; i++) { scanf("%d",&stone[i]); } int mmin=solve_min(stone,n); int mmax=solve_max(stone,n); for(j=1; j
mmax) mmax=tmax; } printf("%d\n%d\n",mmin,mmax); } return 0;}

转载地址:http://zrbmx.baihongyu.com/

你可能感兴趣的文章
APP下载链接在微信打开无法打开的解决方案
查看>>
web客户端密码加密是否有意义
查看>>
CentOS 6.5 zabbix 3.0.4 乱码问题
查看>>
zabbix3.0 邮件报警配置
查看>>
全球15个顶级博客
查看>>
网红沈大师还是程大师,一个中肯的HCIE面试PASS
查看>>
自动化管理工具puppet
查看>>
我的友情链接
查看>>
访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)
查看>>
【Composer】实战操作二:自己创建composer包并提交
查看>>
CSS样式命名的重要性
查看>>
http 错误413
查看>>
让密码不再被遗忘 - 在web中尝试图形口令!
查看>>
Mysql 5.7.20 mysql innodb 系统表损坏带来的问题
查看>>
变更 Linux、Ubuntu 时区、时间
查看>>
java 金额转中文大写
查看>>
web系统如何设计登陆功能
查看>>
c语言实现数据结构中的队列
查看>>
电脑双击与右键打开菜单很慢
查看>>
python-27:如何获取多个页面的源码
查看>>