算法学习第十六天:动态规划(补充题目)

news/2025/3/30 17:08:35/

动态规划

目录

  1. 最大乘积子数组
  2. 股票买卖问题
  3. 最长递增子序列
  4. 零钱兑换
  5. 编辑距离

最大乘积子数组

问题描述

给定一个整数数组,求乘积最大的连续子数组的乘积。

关键点

  • 需要同时记录当前最大值和最小值(负负得正)
  • 状态转移方程:
    • max_dp[i] = max(nums[i], max_dp[i-1]*nums[i], min_dp[i-1]*nums[i])
    • min_dp[i] = min(nums[i], max_dp[i-1]*nums[i], min_dp[i-1]*nums[i])

C++代码

int maxProduct(vector<int>& nums) {int max_val = nums[0], min_val = nums[0], res = nums[0];for (int i = 1; i < nums.size(); ++i) {int tmp_max = max({nums[i], max_val * nums[i], min_val * nums[i]});int tmp_min = min({nums[i], max_val * nums[i], min_val * nums[i]});max_val = tmp_max;min_val = tmp_min;res = max(res, max_val);}return res;
}

股票买卖问题

通用动态规划思路

  • 状态定义dp[i][k][0/1] 表示第i天,最多交易k次,是否持有股票时的最大利润。
  • 状态转移
    • dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
    • dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])

交易一次(LeetCode 121)

int maxProfit(vector<int>& prices) {int buy = INT_MIN, sell = 0;for (int price : prices) {buy = max(buy, -price);sell = max(sell, buy + price);}return sell;
}

交易无限次(LeetCode 122)

int maxProfit(vector<int>& prices) {int profit = 0;for (int i = 1; i < prices.size(); ++i)if (prices[i] > prices[i-1])profit += prices[i] - prices[i-1];return profit;
}

交易两次(LeetCode 123)

int maxProfit(vector<int>& prices) {int buy1 = INT_MIN, sell1 = 0, buy2 = INT_MIN, sell2 = 0;for (int price : prices) {buy1 = max(buy1, -price);sell1 = max(sell1, buy1 + price);buy2 = max(buy2, sell1 - price);sell2 = max(sell2, buy2 + price);}return sell2;
}

最长递增子序列

动态规划(O(n²))

int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(), 1);int res = 1;for (int i = 1; i < nums.size(); ++i) {for (int j = 0; j < i; ++j)if (nums[i] > nums[j])dp[i] = max(dp[i], dp[j] + 1);res = max(res, dp[i]);}return res;
}

贪心+二分(O(n log n))

int lengthOfLIS(vector<int>& nums) {vector<int> lis;for (int num : nums) {auto it = lower_bound(lis.begin(), lis.end(), num);if (it == lis.end()) lis.push_back(num);else *it = num;}return lis.size();
}

零钱兑换

动态规划

  • 状态定义dp[i]表示凑出金额i所需的最少硬币数。
  • 状态转移dp[i] = min(dp[i], dp[i - coin] + 1)
int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, amount + 1);dp[0] = 0;for (int i = 1; i <= amount; ++i)for (int coin : coins)if (coin <= i)dp[i] = min(dp[i], dp[i - coin] + 1);return dp[amount] > amount ? -1 : dp[amount];
}

编辑距离

动态规划

  • 状态定义dp[i][j]表示将word1i个字符转换为word2j个字符的最小操作数。
  • 状态转移
    • word1[i-1] == word2[j-1]dp[i][j] = dp[i-1][j-1]
    • 否则:dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for (int i = 0; i <= m; ++i) dp[i][0] = i;for (int j = 0; j <= n; ++j) dp[0][j] = j;for (int i = 1; i <= m; ++i)for (int j = 1; j <= n; ++j)if (word1[i-1] == word2[j-1])dp[i][j] = dp[i-1][j-1];elsedp[i][j] = 1 + min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});return dp[m][n];
}
文章来源:https://blog.csdn.net/weixin_45977737/article/details/146501064
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/1583616.html

相关文章

【PGCCC】PostgreSQL Certified Master 个人专访 | 第二期 何雄

由PGCCC发起的“PostgreSQL Certified Master个人专访”栏目&#xff0c;旨在挖掘PCM们对数据库行业的深度洞察&#xff0c;分享他们对行业发展的思考和个人感悟&#xff0c;对广大PGer们具有实际借鉴意义。 1.请简单介绍一下自己,您的爱好、您的事业。 大家好&#xff0c;我…

查看自己的公有ip

IP 地址 112.3.88.1** 是一个 公有 IP 地址&#xff0c;而不是私有 IP 地址。 公有 IP 地址 vs 私有 IP 地址 公有 IP 地址: 用于在互联网上唯一标识设备。由互联网服务提供商&#xff08;ISP&#xff09;分配。可以在全球范围内路由和访问。例如&#xff1a;112.3.88.156、8.8…

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…

Rust从入门到精通之入门篇:3.Hello World

Hello World 学习目标 完成本章学习后&#xff0c;你将能够&#xff1a; 创建并运行第一个 Rust 程序理解 Rust 程序的基本结构使用 Cargo 管理 Rust 项目了解 Rust 的编译和执行过程编写简单的 Rust 代码并添加注释 在本章中&#xff0c;我们将创建并运行第一个 Rust 程序…

使用python爬取网络资源

整体思路 网络资源爬取通常分为以下几个步骤&#xff1a; 发送 HTTP 请求&#xff1a;使用requests库向目标网站发送请求&#xff0c;获取网页的 HTML 内容。解析 HTML 内容&#xff1a;使用BeautifulSoup库解析 HTML 内容&#xff0c;从中提取所需的数据。处理数据&#xff…

流行病学计算

title: “[R语言] 流行病学计算” date: 2022-12-06 lastmod: 2022-12-06 draft: false tags: [“R语言”,“流行病学”,“统计学”] toc: true autoCollapseToc: true 主要来自结果数据计算 R C 计算卡方 compare<-matrix(c(99,48,29,0,2,3,2,0,0,0,0,11),nr 3) compare…

【学习笔记】大模型架构设计与长上下文能力的实现

大模型架构 Encoder-Decoder 继承自传统的Transformer架构&#xff0c;包含一个编码器encoder&#xff0c;以及一个解码器decoder&#xff0c;这个在之前介绍过 其中&#xff0c;编码器采用的是双向注意力&#xff0c;即每一个元素的attention可以关注所有元素&#xff1b;而…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…