有注入漏洞的网站源码网站建设公司 未来
有注入漏洞的网站源码,网站建设公司 未来,wordpress去除标志,wordpress如何汉化主题2024.3.15 题目来源我的题解方法一 记忆化搜索#xff08;自顶向下#xff09;方法二 动态规划#xff08;自底向上#xff09; 题目来源
力扣每日一题#xff1b;题序#xff1a;2312
我的题解
方法一 记忆化搜索#xff08;自顶向下#xff09; 用 f(x,y)表示当木… 2024.3.15 题目来源我的题解方法一 记忆化搜索自顶向下方法二 动态规划自底向上 题目来源
力扣每日一题题序2312
我的题解
方法一 记忆化搜索自顶向下 用 f(x,y)表示当木块的高和宽分别是 x 和 y 时可以得到的最多钱数。我们需要考虑三种情况 如果数组 prices 中存在 (x,y,price) 这一三元组那么可以将木块以 prices 的价格卖出。为了快速判断存在性可以使用一个哈希映射来进行存储即哈希映射的键为 ( h i h_i hi, w i w_i wi)值为 p r i c e i price_i pricei 这样就可以根据木块的高和宽在 O(1) 的时间得到对应的价格。这种情况的状态转移方程为 f(x,y)price。如果 x1那么可以沿水平方向将木块切成两部分它们的高分别是 i ( 1 ≤ i x ) i~(1 \leq i x) i (1≤ix)和 x−i宽均为 y。因此可以得到状态转移方程 f ( x , y ) max 1 ≤ i x { f ( i , y ) f ( x − i , y ) } f(x, y) \max_{1 \leq i x} \big\{ f(i, y) f(x-i, y) \big\} f(x,y)max1≤ix{f(i,y)f(x−i,y)}如果 y1那么可以沿垂直方向将木块切成两部分它们的宽分别是 j ( 1 ≤ j y ) j~(1 \leq j y) j (1≤jy) 和 y−j高均为 x。因此可以得到状态转移方程 f ( x , y ) max 1 ≤ j y { f ( x , j ) f ( x , y − j ) } f(x, y) \max_{1 \leq j y} \big\{ f(x, j) f(x, y-j) \big\} f(x,y)max1≤jy{f(x,j)f(x,y−j)} 当有多种情况满足时我们需要选择它们中的较大值。最终的答案即为 f(m,n)。 时间复杂度O(mn(mn)p)其中 p 是数组 prices的长度。 空间复杂度O(mnp)即为哈希映射和动态规划的数组需要使用的空间。 public long sellingWood(int m, int n, int[][] prices) {MapString, Integer value new HashMap();for (int[] price : prices) {value.put(price[0]-price[1], price[2]);}//记忆化搜索的备忘录long[][] memo new long[m 1][n 1];for (long[] row : memo) {Arrays.fill(row, -1);}return dfs(m, n, value, memo);
}public long dfs(int x, int y, MapString, Integer value, long[][] memo) {if (memo[x][y] ! -1) {return memo[x][y];}String key x-y;long ret value.containsKey(key) ? value.get(key) : 0;if (x 1) {//沿水平方向切for (int i 1; i x; i) {ret Math.max(ret, dfs(i, y, value, memo) dfs(x - i, y, value, memo));}}if (y 1) {//沿垂直方向切for (int j 1; j y; j) {ret Math.max(ret, dfs(x, j, value, memo) dfs(x, y - j, value, memo));}}memo[x][y] ret;return ret;
}方法二 动态规划自底向上 时间复杂度O( m 2 n 2 p m^2n^2p m2n2p) 空间复杂度O(mnp) public long sellingWood(int m, int n, int[][] prices) {MapString, Integer value new HashMap();for (int[] price : prices) {value.put(price[0] - price[1], price[2]);}long[][] dp new long[m 1][n 1];for (int x 1; x m; x) {for (int y 1; y n; y) {String key x - y;long ret value.containsKey(key) ? value.get(key) : 0;if (x 1) {// 沿水平方向切for (int i 1; i x; i) {ret Math.max(ret, dp[i][y] dp[x - i][y]);}}if (y 1) {// 沿垂直方向切for (int j 1; j y; j) {ret Math.max(ret, dp[x][j] dp[x][y - j]);}}dp[x][y] ret;}}return dp[m][n];
}有任何问题欢迎评论区交流欢迎评论区提供其它解题思路代码也可以点个赞支持一下作者哈~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91520.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!