算法导论:第15章 动态规划_1钢条切割

/*
钢条切割:
动态规划与分治的相同点:组合子问题求解原问题
                不同点:分治的子问题不重叠,做了重复工作,动态规划保存解到表中

动态规划的特点:
1最优子结构:问题的最优解由相关子问题的最优解组合而成,子问题可以独立求解

公司出售一段长度为i英寸的钢条价格为Pi(i=1,2,...),钢条长度为整英寸
长度i   1	2	3	4	5	6	7	8	9	10
价格Pi	1	5	8	9	10	17	17	20	24	30
给定长度为n的钢条,求使得的最大收益Rn

分析:
设Rn表示长度为n的钢条的最大收益,Pn表示长度为n的钢条的价格,那么实际上问题对Rn的求解,可以
修改为从不切割也就是Pn,和切分成两段的最大收益,切分成两段共有:n-1种切分方法,即
R1+Rn-1,R2+Rn-2,...,Rn-1+R1
状态转移方程:
Rn=max(Pn,R1+Rn-1,R2+Rn-2,...,Rn-1+R1)


输入的第一行是钢条的长度n

输入:
4
输出:
10
*/

#include <iostream>
#include <string.h>

using namespace std;

const int MAXSIZE = 10000;
const int priceArr[11] = {0 , 1 , 5, 8, 9, 10, 17 , 17 , 20 , 24 , 30};
int rArr[MAXSIZE];


int R(int n)
{
	if(!rArr || !priceArr)
	{
		return -1;
	}
	if(rArr[n] != 0)
	{
		return rArr[n];
	}
	int max = priceArr[n];
	for(int i = 1 ; i <= n - 1; i++)
	{
		int value = R(i) + R(n-i);
		if(value > max)
		{
			max = value;
		}
	}
	rArr[n] = max;
	return max;
}

void process()
{
	int n;
	while(cin >> n)
	{
		memset(rArr , 0 , sizeof(rArr));
		int iResult = R(n);
		cout << iResult << endl;
	}
}

int main(int argc, char* argv[])
{
	process();
	getchar();
	return 0;
}

你可能感兴趣的:(动态规划,算法导论,钢条切割)