剑指 Offer 14- I. 剪绳子
题目:
思路:
第一次接触动态规划,通常是应用于求最优解(这个是最大值)
动态规划的三个特点:
1、求最优解(这里是求成绩的最大值)
2、整体问题的最优解依赖于各个子问题的最优解。(对方10分解,分解为4和6。再对4和6进行分解)
3、各个小问题之间还有有相互重叠的部分。(10=46,6=42)
4、从上往下分析,从下往上求解(类似于递归求解斐波那契,有重叠的部分,从下往上可以避免重复计算)
从4向上一次计算+1,+1,子问题的最优解都存放于数组中。
题解:
class Solution {
public int cuttingRope(int n) {
// 处理边界
if (n == 2) {
return 1;
} else if (n == 3) {
return 2;
}
int[] muti = new int[n + 1];
muti[0] = 0;
muti[1] = 1;
muti[2] = 2;
muti[3] = 3;
int max = 0;
for (int i = 4; i <= n; i++) {
// 计算每 +1长度的max,将其放入数组中,后续直接用这个值
for (int j = 1; j <= i / 2; j++) {
int temp = muti[j] * muti[i - j];
if (temp > max) {
max = temp;
}
}
muti[i] = max;
}
// 直接从数组中取出最大值
return muti[n];
}
}