没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
3页
Problem B:Pebble Merging Description 在一个圆形操场的四周摆放着n 堆石子。现要将石子 有次序地合并成一堆。规定每次只能选相邻的2 堆石 子合并成新的一堆,并将新的一堆石子数记为该次合 并的得分。试设计一个算法,计算出将n堆石子合并 成一堆的最小得分和最大得分。 编程任务: 对于给定n堆石子,编程计算合并成一堆的最小得分和 最大得分。 Input 输入由多组测试数据组成。 每组测试数据输入的第1 行是正整数n,1≤n≤100,表示 有n堆石子。第二行有n个数,分别表示每堆石子的个数。 Output 对应每组输入,输出的第1 行中的数是最小得分;第2 行 中的数是最大得分。 Sample Input 4 4 4 5 9 Sample Output Hint 43 54
资源推荐
资源详情
资源评论
#include <iostream>
#include <string>
using namespace std;
#define N 500
#define oo 2000000000
#define MIN(a, b) (a)<(b)?(a):(b)
#define MAX(a, b) (a)>(b)?(a):(b)
typedef struct { int c, d; } Node;
int n;
int v[N];
int save[N];
Node f[N][N];
int sum[N][N];
void Solve(int flag)
{
int i, j, k, x, t, result;
for(i = 1; i <= n; i++)
f[i][1].c = f[i][1].d = 0;
for(j = 2; j <= n; j++) {
for(i = 1; i <= n; i++) {
t = sum[i][j];
if(flag == 0) f[i][j].c = oo;
else f[i][j].c = 0;
for(k = 1; k <= j-1; k++) {
x = (i + k - 1)%n + 1;
if((flag == 0 && f[i][k].c + f[x][j-k].c + t < f[i][j].c)
||(flag != 0 && f[i][k].c + f[x][j-k].c + t > f[i][j].c)) {
f[i][j].c = f[i][k].c + f[x][j-k].c + t;
#include <string>
using namespace std;
#define N 500
#define oo 2000000000
#define MIN(a, b) (a)<(b)?(a):(b)
#define MAX(a, b) (a)>(b)?(a):(b)
typedef struct { int c, d; } Node;
int n;
int v[N];
int save[N];
Node f[N][N];
int sum[N][N];
void Solve(int flag)
{
int i, j, k, x, t, result;
for(i = 1; i <= n; i++)
f[i][1].c = f[i][1].d = 0;
for(j = 2; j <= n; j++) {
for(i = 1; i <= n; i++) {
t = sum[i][j];
if(flag == 0) f[i][j].c = oo;
else f[i][j].c = 0;
for(k = 1; k <= j-1; k++) {
x = (i + k - 1)%n + 1;
if((flag == 0 && f[i][k].c + f[x][j-k].c + t < f[i][j].c)
||(flag != 0 && f[i][k].c + f[x][j-k].c + t > f[i][j].c)) {
f[i][j].c = f[i][k].c + f[x][j-k].c + t;
资源评论
shi440
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功