惩罚矩阵?动态规划是如何爱上矩阵的

news/2024/12/22 20:54:18/

标题:用惩罚矩阵破解动态规划难题——带你一步步实现C++代码

正文:

你是否曾经遇到过这样的挑战:如何高效地计算一个序列中某个子序列的出现次数?当问题变得复杂时,惩罚矩阵可能就是你需要的解锁工具!在这篇文章中,我们不仅会揭示惩罚矩阵在动态规划中的神奇作用,还将提供完整的C++代码示例,帮助你真正掌握这一技巧。

动态规划与惩罚矩阵的强强联合

动态规划(DP)是一种解决优化问题的经典方法,但面对复杂约束时,问题常常会变得棘手。这时候,惩罚矩阵可以帮助你在计算中引入额外的代价,从而有效地处理各种约束条件。

惩罚矩阵的基本概念

惩罚矩阵(Penalty Matrix)用于表示在状态转移过程中违反约束条件的额外代价。通过将这些代价纳入计算,你可以更加精准地处理各种复杂问题。

例子分析:字符串中子串出现次数计算

假设你要计算字符串 “ababc” 中子串 “abc” 的出现次数,但要求 “abc” 不能连续出现。我们可以利用动态规划结合惩罚矩阵来解决这个问题。

C++代码实现

接下来,我们通过C++代码来展示如何利用惩罚矩阵解决这个问题。假设 dp[i][j] 表示到达位置 i 时,子串长度为 j 的出现次数,而 penalty[i][j] 记录在特定条件下的额外代价。

#include <iostream>
#include <vector>
#include <string>using namespace std;int countOccurrencesWithPenalty(const string& s, const string& sub) {int n = s.size();int m = sub.size();vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));vector<vector<int>> penalty(n + 1, vector<int>(m + 1, 0));// Initial statedp[0][0] = 1;// Fill DP tablefor (int i = 0; i < n; ++i) {for (int j = 0; j <= m; ++j) {if (j < m && s[i] == sub[j]) {dp[i + 1][j + 1] = dp[i][j] + penalty[i + 1][j + 1];}dp[i + 1][0] += dp[i][0]; // Accumulate counts when no match}// Handle penalties for continuous matchingfor (int j = 1; j <= m; ++j) {if (i >= j - 1 && s.substr(i - j + 1, j) == sub) {penalty[i + 1][j] = 1; // Example penalty, adjust as needed}}}return dp[n][m];
}int main() {string s = "ababc";string sub = "abc";int result = countOccurrencesWithPenalty(s, sub);cout << "The number of occurrences of \"" << sub << "\" in \"" << s << "\" is: " << result << endl;return 0;
}

如何运作

  1. 状态定义dp[i][j] 记录到达位置 i 时子串 sub 长度为 j 的出现次数。
  2. 初始化dp[0][0] = 1 表示初始状态,penalty 矩阵记录违反条件的额外代价。
  3. 状态转移:当字符匹配时更新 dp,并根据 penalty 矩阵调整代价。
  4. 获取结果:最终结果为 dp[n][m],表示整个字符串中子串出现次数的计算结果。

总结

通过使用惩罚矩阵,我们能够在动态规划中处理复杂的约束条件。是否觉得这个方法很有趣?惩罚矩阵使得我们能够灵活处理各种约束,让问题解决起来变得更加高效。试试看,应用这一技巧到你的实际问题中吧!

你有没有在动态规划中使用其他有趣的方法?欢迎在评论中分享你的经验或提出问题!


http://www.ppmy.cn/news/1523241.html

相关文章

万界星空科技MES:企业实现数字化转型的护航者

万界星空科技在制造业管理软件领域&#xff0c;特别是MES系统上的技术实力和创新能力&#xff0c;为制造型企业实现数字化转型提供了全方位的支持和保障。 一、万界星空MES系统的核心功能 实时数据采集与分析&#xff1a; 万界星空科技MES系统通过物联网技术实时采集生产现场的…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【在Linux世界中追寻伟大的One Piece】NAT|代理服务|内网穿透你会吗?

目录 1 -> NAT技术背景 1.1 -> NAT IP转换过程 1.2 -> NAPT 1.3 -> NAT技术的缺陷 2 -> 代理服务器 2.1 -> 正向代理 2.1.1 -> 概述 2.1.2 -> 工作原理 2.1.3 -> 功能特点 2.1.4 -> 应用场景 2.2 -> 反向代理 2.2.1 -> 概述 …

洛谷 P10798 「CZOI-R1」消除威胁

题目来源于&#xff1a;洛谷 题目本质&#xff1a;贪心&#xff0c;st表&#xff0c;单调栈 解题思路&#xff1a;由于昨天联练习了平衡树&#xff0c;我就用平衡树STL打了个暴力&#xff0c;超时得了30分 这是暴力代码&#xff1a; #include<bits/stdc.h> using name…

Windows环境下 VS2022 编译 LAME 源码

LAME LAME 是一个非常流行的开源 MP3 编码器库&#xff0c;它的全称是 “LAME Ain’t an MP3 Encoder”&#xff0c;这是一个带有讽刺意味的名字&#xff0c;因为 LAME 实际上是一个功能强大的 MP3 编码器。LAME 的开发始于 1998 年&#xff0c;目的是创建一个开放源代码的库&a…

147.最小栈

题目 链接&#xff1a;leetcode链接 思路 这道题目做起来还是比较简单的&#xff0c;使用两个栈就可以实现题目要求。 其中一个栈s实现栈的基本功能&#xff0c;另一个栈mins实现检索最小元素的功能。 来看一下怎么样实现检索最小元素的功能呢&#xff1f; 我们可以这么…

智狐联创平台引入 Midjourney 绘画服务,开启创意新征程

作为人工智能领域创新平台&#xff0c;智狐联创宣布已全面支持 Midjourney 绘画服务&#xff0c;为广大用户带来全新的视觉创作体验。 智狐联创平台一直致力于为用户提供丰富多样且强大的人工智能服务与功能。此次接入 Midjourney 绘画服务&#xff0c;进一步丰富了其创作工具的…

报表生成---JFreeChart

JFreeChart 是一个开源的 Java 图表库&#xff0c;它提供了丰富的图表类型和灵活的定制选项&#xff0c;用于在 Java 应用程序中生成和显示图表。以下是 JFreeChart 的一些关键特点和功能&#xff1a; 多种图表类型&#xff1a;JFreeChart 支持多种图表类型&#xff0c;包括但不…