動態規划法適用場景:當前結果與上一個結果相關聯
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]; } }