面试题14:剪绳子(动态规划+贪婪算法)C++

一、动态规划:
应用动态规划之前要分析该问题是否能够将大问题分解成为小问题,分解的问题往往也具有最优解,如果把小问题的最优解组合起来能够得到问题的整体解,那么该问题可以使用动态规划去解决
特点:从上往下分析,从下往上解决

#include

class max_ProductCutting_solution
{
	int* products;
	int product;
	int m_max;
public:
	int c_max_ProductCutting_solution(int length);
	~max_ProductCutting_solution() { delete[] products; }
};
int max_ProductCutting_solution::c_max_ProductCutting_solution(int length)
{
	if (length < 2)return 0;
	if (length == 2)return 1;
	if (length == 3)return 2;
	products = new int[length + 1];
	products[0] = 0;
	products[1] = 1;
	products[2] = 2;
	products[3] = 3;
	for (int i = 4;i <= length;++i)
	{
		m_max = 0;
		for (int j = 1;j <= i / 2;++j)
		{
			product = products[j] * products[i - j];
			if (m_max < product)
			{
				m_max = product;
				products[i] = m_max;
			}
		}
	}
	return products[length];
}
int main(int argc, char* argv[])
{
	max_ProductCutting_solution B;
	std::cout << B.c_max_ProductCutting_solution(8) << std::endl;
	std::cin.get();
	return 0;
}

2、贪心算法
使用贪心算法需要具备一定的数学建模能力
在剪绳子的贪心算法中,根据3(n-3)>n,2(n-2)>n,可得当绳子剪到3或者2的时候是最好的
其中需要注意的是,当绳子长度/3的余数为0,1,2,当为2的时候,根据2的剪法剪剩余的,为0的时候刚刚剪完,但是,当余数为1的时候,说明剪多了一次,所以timeOf–,将多剪的一段与1组成为2的倍数即可

#include
class max_ProductCutting_solution
{
public:
	int c_max_ProductCutting_solution(int length);
};

int max_ProductCutting_solution::c_max_ProductCutting_solution(int length)
{
	if (length < 2)return 0;
	if (length == 2)return 1;
	if (length == 3)return 2;
	int timesOf3 = length / 3;
	if (length - timesOf3 * 3 == 1)
		timesOf3 -= 1;
	int timeOf2 = (length - timesOf3 * 3) / 2;
	return (int)pow(3, timesOf3) * (int)(pow(2, timeOf2));
}

int main(int argc, char* argv[])
{
	max_ProductCutting_solution B;
	std::cout << B.c_max_ProductCutting_solution(10) << std::endl;
	std::cin.get();
	return 0;
}

你可能感兴趣的:(C++剑指Offer刷题集)