动态规划法适用场景:当前结果与上一个结果相关联
1.整数拆分:将一个整数拆分为至少两个数,然后求各个数的最大乘积。
//定理:将一个数拆解为两个数时:(n/2)*(n-n/2)可得到最大乘积,拆解成大于两个数时,最大乘积为:max(i*f(n-i)),1<i<n/2
class Solution { // 动态规划 public int integerBreak(int n) { if (n <= 3) return n - 1; int[] dp = new int[n + 1]; //初始化,1,2,3特殊处理 dp[1] = 1; dp[2] = 2; dp[3] = 3; for (int i = 4; i <= n; i++) { for (int j = 1; j <= i / 2; j++) { dp[i] = Math.max(dp[i], dp[j] * dp[i - j]); } } return dp[n]; } }