leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目
https://leetcode-cn.com/problems/optimal-division/description/
題解
兩個dp表相互依賴,沒繼續(xù)往后推自底向上的遞歸。
這題填dp的每一個位置都要O(n),轉(zhuǎn)換成自底向上的dp之后,可能會有斜率優(yōu)化。
這么有趣的題,不知道為啥這么多人踩。。
class Solution {class Info {String exp;float value;public Info(String exp, float value) {this.exp = exp;this.value = value;}}public String optimalDivision(int[] nums) {// leftMax/rightMinInfo[][] dpMax = new Info[nums.length][nums.length];Info[][] dpMin = new Info[nums.length][nums.length];Info info = processMax(0, nums.length - 1, nums, dpMax, dpMin);return info.exp;}public Info processMax(int L, int R, int[] nums, Info[][] dpMax, Info[][] dpMin) { // [L,R]閉區(qū)間if (L == R) {dpMax[L][R] = new Info(String.valueOf(nums[L]), nums[L]);} else {Info maxInfo = null;for (int M = L; M < R; M++) {Info leftMax;if (dpMax[L][M] != null) leftMax = dpMax[L][M];else leftMax = processMax(L, M, nums, dpMax, dpMin);Info rightMin;if (dpMin[M + 1][R] != null) rightMin = dpMin[M + 1][R];else rightMin = processMin(M + 1, R, nums, dpMax, dpMin);if (maxInfo == null || leftMax.value / rightMin.value > maxInfo.value) {String rightExp = M + 1 == R ? rightMin.exp : "(" + rightMin.exp + ")";maxInfo = new Info(leftMax.exp + "/" + rightExp, leftMax.value / rightMin.value);}}dpMax[L][R] = maxInfo;}return dpMax[L][R];}public Info processMin(int L, int R, int[] nums, Info[][] dpMax, Info[][] dpMin) {if (L == R) {dpMin[L][R] = new Info(String.valueOf(nums[L]), nums[L]);} else {Info minInfo = null;for (int M = L; M < R; M++) {Info leftMin;if (dpMin[L][M] != null) leftMin = dpMin[L][M];else leftMin = processMin(L, M, nums, dpMax, dpMin);Info rightMax;if (dpMax[M + 1][R] != null) rightMax = dpMax[M + 1][R];else rightMax = processMax(M + 1, R, nums, dpMax, dpMin);if (minInfo == null || leftMin.value / rightMax.value < minInfo.value) {String rightExp = M + 1 == R ? rightMax.exp : "(" + rightMax.exp + ")";minInfo = new Info(leftMin.exp + "/" + rightExp, leftMin.value / rightMax.value);}}dpMin[L][R] = minInfo;}return dpMin[L][R];} }總結(jié)
以上是生活随笔為你收集整理的leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 1143. Longe
- 下一篇: leetcode 174. Dungeo