动态规划之三:剪绳子变形之切割杆

原创 2018年04月17日 10:01:27

问题:现在已知有一个长度为n的切割杆,且1~n长度对应的价值存储在prices[n]数组中,将其进行若干次切割,求其达到的最大价值?

      通过问题的叙述我们可以发现,和前一篇讲解的动态规划之二:剪绳子问题很相似,都属于动态规划的内容,因此我们就用动态规划的思想来解决问题。

      现在使用形式化语言来描述问题规模的最大价值状态,即f(n)表示长度为n的切割杆的最大价值。prices[n]数组中存储对应长度为1~n的价值并且是随机的,也就是说prices[2]的价值并不比prices[1]的价值大。因此假设我们第一次切割的长度为i,其最大价值为f(i),剩余的切割杆的长度为n-i,其最大价值为f(n-i):

使用具体示例进行分析:

    当n=0时,f(0)= 0;

    当n=1时,f(1)= prices[0];

    当n=2时,f(2)= max( prices[1] , f(1)+f(1) );

    当n=3时,f(3)= max( prices[2] , f(1)+f(2) );

    当n=4时,f(4)= max( prices[3] , f(1)+f(3) , f(2)+f(2) );

    .......

                  f(n)=max( prices[n-1] , f(1)+f(n-1) , f(2)+f(n-2) , ...,f(i)+f(n-i) )       ( i>=0 && i<n/2 )

由此,我们可以知道状态转移函数为:f(n)= max( prices[n-1] , f(i) *+f(n-i)  ) , 其中i的取值范围为(i>0&&i<=n/2)。

程序结果如下:

#include<iostream>  
using namespace std;
#define size 100  //表格的大小  

int Line_Max(int a[], int n) {
	if (n <= 0)
		return 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i / 2; j++)     //比较的范围为:(1,n/2)  
			if (a[j] +a[i - j]>a[i])
				a[i] = a[j] + a[i - j];
	return a[n];
}

int main() {
	int table[size] = { 0 };
	int prices[size];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> prices[i];
	for (int i = 1; i <= n; i++)
		table[i] = prices[i-1];//对表格用prices数组进行初始化,用来存储长度为i的最大乘积值
	cout <<"长度为"<<n<<"的最大价值为:"<< Line_Max(table, n) << endl;
	return 0;
}

动态规划or贪心算法--剪绳子/切割杆

需求一: 剪绳子,将长度为n的绳子剪成若干段,求各段长度乘积的最大值分析: 1、动态规划    设f(n)代表长度为n的绳子剪成若干段的最大乘积,如果第一刀下去,第一段长度是i,那么剩下的就需要剪n-...
  • upupday19
  • upupday19
  • 2018-02-12 12:06:41
  • 311

剑指Offer(第二版)面试题14:剪绳子(动态规划)

剑指Offer(第二版)面试题14:剪绳子(动态规划)
  • qq_25827845
  • qq_25827845
  • 2017-06-16 21:45:00
  • 4569

剪绳子算法--动态规划法

使用动态规划法求解剪绳子问题,products中保存每一段的最优解int maxProductAfterCutting_sholution(int length){ if(length...
  • lixiangming_10010
  • lixiangming_10010
  • 2017-11-20 10:48:31
  • 107

java剪绳子

package offer; /* * 剪绳子 */ public class CatShengZi { public static void main(String[] args) { ...
  • taotao12312
  • taotao12312
  • 2017-09-01 11:40:35
  • 194

剑指offer--面试题14:剪绳子

#include #include // ====================动态规划==================== int maxProductAfterCutting_solut...
  • u010726692
  • u010726692
  • 2017-07-12 10:32:50
  • 884

动态规划之二:剪绳子问题

问题:现有一根长度为N的绳子,需要你剪成M段,使M段的乘积最大。(其中M、N都为整数,剪成的每段长度也为整数,N已知,M未知)例如 绳子长度N=8 剪成M=3,数值为别为2,3,3,则乘积最大为 2*...
  • zjx_cfbx
  • zjx_cfbx
  • 2018-04-15 20:58:56
  • 127

Java 实现剪绳子

给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少?...
  • sinat_32393077
  • sinat_32393077
  • 2017-07-04 10:47:21
  • 774

关于切割绳子的思考

n个人抢一个一元红包,估计得到最小红包的那个人将有多少钱?这个问题可以转换为类似的问题,将一根绳子分成N段,最短的绳子的期望是多少?...
  • pp634077956
  • pp634077956
  • 2016-10-22 20:36:43
  • 681

剑指Offer面试题14:剪绳子 Java代码实现

剑指Offer 面试题14:剪绳子 原题描述: 面试题14:剪绳子 给你一根长度为n的绳子,请把绳子剪成m段(m,n都是大于1 的整数)。每段绳子长度的可能最大乘积是多少。 分析问题的...
  • hh_zheng
  • hh_zheng
  • 2017-11-07 21:30:16
  • 182

《剑指offer》面试题14:剪绳子(动态规划、贪婪算法)

更多剑指offer面试习题请点击: 《剑指offer》(第二版)题集目录索引 题目: 给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n&amp;gt;1并且m&amp;gt;1)。每段...
  • Tianzez
  • Tianzez
  • 2018-01-26 13:42:38
  • 303
收藏助手
不良信息举报
您举报文章:动态规划之三:剪绳子变形之切割杆
举报原因:
原因补充:

(最多只允许输入30个字)