石子合并
来源:互联网 发布:吉利电动车知豆d1报价 编辑:程序博客网 时间:2024/06/06 19:38
题目描述
在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
输入格式
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.
输出格式
输出共2行,第1行为最小得分,第2行为最大得分.
输入示例:
4
4 4 5 9
输出示例:
43
54
代码:
#include<iostream>#include<cstdio>#include<algorithm>#define INF 1<<30const int N=205;using namespace std;int a[N];int main(){ int n; while(~scanf("%d",&n)) { int sum[N]={0}; int dpmax[N][N]={0}; int dpmin[N][N]={0}; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++) sum[n+i]=sum[n+i-1]+a[i]; for(int L=2;L<=n;L++)//枚举长度 { for(int i=1;i<=2*n-L+1;i++)//因为是一个圆形的石堆,否则i<=n-l+1即可 { int j=i+L-1; dpmax[i][j]=-INF; dpmin[i][j]=INF; for(int k=i;k<j;k++) { dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]+dpmax[k+1][j]+sum[j]-sum[i-1]); dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]+dpmin[k+1][j]+sum[j]-sum[i-1]); } } } int maxn=-INF,minn=INF; //确定长度为n的石子合并的最大得分和最小得分 for(int i=1;i<=n;i++) { maxn=max(dpmax[i][i+n-1],maxn); minn=min(dpmin[i][i+n-1],minn); } if(n==1) maxn=a[1],minn=a[1]; printf("%d\n%d\n",minn,maxn); } return 0;}
1 0
- 石子-石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 【石子合并】
- 合并石子
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 合并石子
- 石子合并
- 合并石子
- Android怎么获取ListView的值
- hdu2059(dp)
- 员工管理系统(数组)
- Android uiautomator 使用入门官方教程
- 存储函数
- 石子合并
- 关于OCTAVE
- JavaScriptの函数思考(一)
- hdu2516(巴什博弈)
- NYOJ 118 修路方案 (次小生成树--prime)
- 第二章 概述
- [leetcode-274]H-Index(java)
- 【二分匹配】【HK算法模板】
- [译]NGINX缓存使用官方指南