石子合并问题操场玩法

使用动态规划解决石子合并问题:

动态规划通常用来求解最优化问题,即一个问题有多个解,每个解都有一个目标值,我们希望寻找具有最优值(最小或最大)的解

动态规划算法寻求石子合并时的最大,最小得分,选择相邻的两堆石子堆进行合并,其最终花费的代价与石子堆的排列顺序有关。根据其重叠子问题建立状态转移方程,利用程序进行求解。此问题具有重叠子结构

因此从已有的 i 到 j 的最小得分,与从 i 到 k 的最小得分、从 k+1 到 j 的最小得分、当前步骤从 i 到 j 的合并得分的和的最小值,最大也同此想法。

代码附上:

#include<iostream>

#include<bits/stdc++.h>

using namespace std;

const int M = 220;

int MAX[M][M];

int MIN[M][M];

int num[M];

int sum[M];

int n;

int main() {

printf("请输入石子堆数:\n");

cin >> n;

for (int i = 1;i <= n - 1;i++){

num[n+i]=num[i];

}

sum[0] = 0;

for (int i = 1; i <= n; i++) {

scanf("%d", num + i);

sum[i] = sum[i - 1] + num[i];

}

memset(MIN , -1 ,sizeof(MIN));

for (int l = 1; l <= n; l ++) {

for (int i = 1; i + l - 1 <= n; i++) {

int j = i + l - 1;

if (l == 1) {

MAX[i][j] = 0;

MIN[i][j] = 0;

}

else {

for (int k = i; k < j; k++) {

int maxnum = MAX[i][k] + MAX[k + 1][j] + sum[j] - sum[i - 1];

int minnum = MIN[i][k] + MIN[k + 1][j] + sum[j] - sum[i - 1];

if (MAX[i][j] < maxnum) {

MAX[i][j] = maxnum;

}

if (MIN[i][j] == -1 ||MIN[i][j] > minnum) {

MIN[i][j] = minnum;

}

}

}

}

}

printf("最大得分为:%d\n", MAX[1][n]);

printf("最小得分为:%d\n", MIN[1][n]);

return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值