算法导论-切割三种实现方式


#include<iostream>
#include"string"
#include <malloc.h>
#include <queue>
using namespace std;
//int n = 10;
int p[] = { 0,1,5,8,9,10,17,17,20,24,30 };//钢条长度为i时的整体价值;
int r[11];
/*
*1.错误的自上而下的递归调用法
* 要注意,在for循环中如果i初始是1,那对于p[0]来说就要是0
* 如果是0,那就要对于后面的n-i还要-1,不然还是错
*/
int cut_rod(int n) {
	if (n == 0) return 0;
	int q = -1;
	//for (int i = 0; i < n; i++) q = max(q, p[i] + cut_rod(n - i - 1));
	for (int i = 1; i <= n; i++) q = max(q, p[i] + cut_rod(n - i));
	return q;
}
/*
* 2.自下而上法,动用两个for循环
*/
int bottom_cut_rod(int n) {
	
	int q;
	r[0] = 0;
	for (int i = 1; i < n + 1; i++)
	{
		q = INT_MIN;
		for (int j = 1; j <= i; j++) r[i] = max(r[i], p[j] + r[i - j]);
		//r[i] = q; 这里要注意是可以把q 换成r[i]的
	}
	return r[n];
}
/*
* 3.带备忘的自上而下法,就是单纯的填表,别就按照伪代码写,好歹想一想顺序
*/

int memoized_cut_rod_aux(int n) {
	int q;
	if (r[n] >= 0) return r[n];
	if (n == 0) q = 0;
	else {
		q = INT_MIN;
		for (int i = 1; i < n + 1; i++) q = max(q, p[i] + memoized_cut_rod_aux(n - i));
	}
	r[n] = q;
	return q;

}
int memoized_cut_rod(int n){
	for (int i = 0; i < n + 1; i++) r[i] = -1;
	return memoized_cut_rod_aux(n);
}



int main() {
    //n这里我就随便选个4,不过一种算法n要小一点,不然会花时间
	cout << "自下而上: " << cut_rod(4) << endl;
	cout << "动态规划的自下而上: " << bottom_cut_rod(4) << endl;
	cout << "填表式的自上而下: " << memoized_cut_rod(4) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值