酷家乐网站做墙裙教程修改WordPress上传图片时间
news/
2025/9/24 1:19:49/
文章来源:
酷家乐网站做墙裙教程,修改WordPress上传图片时间,wordpress有小方块,肇庆建网站服务刷题记录 *56. 携带矿石资源#xff08;第八期模拟笔试#xff09;198. 打家劫舍213. 打家劫舍 II*337. 打家劫舍 III解法一 #xff08;记忆化递推#xff09;*解法二 #xff08;动态规划#xff09; *56. 携带矿石资源#xff08;第八期模拟笔试#xff09;
leetco… 刷题记录 *56. 携带矿石资源第八期模拟笔试198. 打家劫舍213. 打家劫舍 II*337. 打家劫舍 III解法一 记忆化递推*解法二 动态规划 *56. 携带矿石资源第八期模拟笔试
leetcode题目地址
多重背包问题可以拆解成01背包问题。
时间复杂度 O ( m ∗ n ∗ k ) O(m*n*k) O(m∗n∗k) 空间复杂度 O ( n ) O(n) O(n)
// c
#includebits/stdc.h
using namespace std;
int main(){int c,n;cincn;vectorint weight(n, 0);vectorint value(n, 0);vectorint nums(n, 0);vectorint dp(c1, 0);for (int i 0; i n; i) cin weight[i];for (int i 0; i n; i) cin value[i];for (int i 0; i n; i) cin nums[i];for(int i0; in; i){for(int jc; jweight[i]; j--){for(int k1; knums[i](j-k*weight[i]0); k){dp[j] max(dp[j], dp[j-k*weight[i]]k*value[i]);}}}std::cout dp[c] std::endl;return 0;
}198. 打家劫舍
leetcode题目地址
dp[i]存储到第i个房屋时的最大价值。
每个房屋有两个状态取或不取。若取则当前房屋的最大价值是dp[i-2]nums[i]若不取则当前房屋的最大价值是前一个房屋的最大价值。因此状态转移方程为 d p [ i ] m a x ( d p [ i − 2 ] n u m s [ i ] , d p [ i − 1 ] ) dp[i] max(dp[i-2]nums[i], dp[i-1]) dp[i]max(dp[i−2]nums[i],dp[i−1])
时间复杂度 O ( n ) O(n) O(n) 空间复杂度 O ( n ) O(n) O(n)
// c
class Solution {
public:int rob(vectorint nums) {if(nums.size()1) return nums[0];vectorint dp(nums.size(), 0);dp[0] nums[0];dp[1] max(nums[0], nums[1]);for(int i2; inums.size(); i){dp[i] max(dp[i-2]nums[i], dp[i-1]);}return dp[nums.size()-1];}
};213. 打家劫舍 II
leetcode题目地址
使用两个dp数组分别记录取头不取尾和取尾不取头。其他逻辑和上一题一致。
时间复杂度 O ( n ) O(n) O(n) 空间复杂度 O ( n ) O(n) O(n)
// c
class Solution {
public:int rob(vectorint nums) {if(nums.size()1) return nums[0];// 取nums[0]vectorint dp(nums.size(), 0);// 不取nums[0]vectorint dp1(nums.size(), 0);dp[0] nums[0];dp[1] max(nums[0], nums[1]);dp1[1] nums[1];for(int i2; inums.size()-1; i){dp[i] max(dp[i-2]nums[i], dp[i-1]);}for(int i2; inums.size(); i){dp1[i] max(dp1[i-2]nums[i], dp1[i-1]);}return max(dp[nums.size()-2],dp1[nums.size()-1]);}
};*337. 打家劫舍 III
leetcode题目地址
解法一 记忆化递推
使用二叉树的后序遍历来求是否加入当前节点使用一个map来记录已经求过的结点值。
时间复杂度 O ( n ) O(n) O(n) 空间复杂度 O ( l o g n ) O(logn) O(logn)
// c
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// 记录计算过的结果保证每个结点只计算一次unordered_mapTreeNode*, int umap;int rob(TreeNode* root) {if(!root) return 0;if(!root-left !root-right) return root-val;// 当前节点已计算过直接返回if(umap[root]) return umap[root];// 取根int val1 root-val;if(root-left) val1 rob(root-left-left) rob(root-left-right);if(root-right) val1 rob(root-right-left) rob(root-right-right);// 不取根int val2 rob(root-left) rob(root-right);// 记录当前结果umap[root] max(val1,val2); return max(val1,val2); // return 0;}
};*解法二 动态规划
使用二叉树的后序遍历来计算左右孩子节点的取与不取的价值再计算当前节点的取与不取返回结果。
思路
时间复杂度 O ( n ) O(n) O(n) 空间复杂度 O ( l o g n ) O(logn) O(logn)
// c
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vectorint robTree(TreeNode* root){if(!root) return {0, 0};vectorint left robTree(root-left);vectorint right robTree(root-right);// 偷当前节点孩子节点不可偷int val1 root-val left[0] right[0];// 不偷当前节点孩子节点可偷可不偷int val2 max(left[0], left[1]) max(right[0], right[1]);return {val2, val1};}int rob(TreeNode* root) {vectorint res robTree(root);return max(res[0], res[1]);}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914463.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!