动态规划
动态规划和分治法很像,都是拆解问题解决
分治法常用递归算法来写,但是动态规划和分治法的最大不同就是存入值 ,AI真方便
钢条切割问题
其实该问题最平常,也是最直接的思想就是先把前项最赚米的方案总结出来,后面直接让程序拆解就行了
分析
比如:我定义 长度 = n,价格 =p
mathf.max是指将 参数一 和 参数二 比较,返回一个最大值
前两个还好说,就是比较不切和切了一次之后的价格
从第三个开始,会发现规律,只需要比较两个值就行了
不切和切一次(看下标,刚才P【2】已经计算过了,而且下标似乎也有规律)
至于切三次长度都为1,直接抛弃,怎么都不会出现全部 切成长度为1的可能
有些值都有了,这就是动态规划的核心点:存储起来
后面那还等什么,直接拿去用,不就解决问题了
上述分析中,有一个点没有写出来
在比较过程中,实际上是分配n后再存储的过程
比如P[n = 2]的情况,先记录p[1]+p[1],存储起来
再比较p[2]与p[1]+p[1]的值,根据下标规律,就可以用两层for循环
代码
int[] prices = { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };int length = 8;Debug.log("Maximum obtainable value is " + CutRod(prices, length));static int CutRod(int[] prices, int n) {int[] dp = new int[n + 1];dp[0] = 0;for (int i = 1; i <= n; i++) {int maxVal = int.MinValue;for (int j = 1; j <= i; j++) {maxVal = Math.Max(maxVal, prices[j] + dp[i - j]);}dp[i] = maxVal;}return dp[n];}