力扣740题动态规划的解题思路和步骤 C++代码实现 力扣每题自带的代码是什么
本文将深入探讨力扣740题——动态规划的解题思路和步骤,并提供C++代码实现。
动态规划基础
动态规划(Dynamic Programming,简称DP)是一种算法思想,用于解决具有重叠子问题和最优子结构特性的问题。在力扣740题中,我们面临的是一个典型的动态规划问题。动态规划的核心在于将问题分解为更小的子问题,并存储这些子问题的解,避免重复计算。
在实际应用中,动态规划通常涉及状态转移方程的构建,它描述了问题的最优解是如何由其子问题的最优解构成的。通过这种方式,我们可以自底向上地构建问题的解决方案。
问题分析
力扣740题要求我们找出在一个由'0'和'1'组成的二进制字符串中,最长的连续子串,使得连续子串中'1'的个数不大于'0'的个数。这个问题可以通过动态规划来解决,我们需要维护一个状态数组,记录到当前位置为止,满足条件的最长子串长度。
具体我们需要跟踪两个状态:一是当前位置结束的子串中'1'的个数,二是'0'的个数。通过这两个状态,我们可以推导出下一个状态,并更新最长子串长度。
状态转移方程
对于状态转移方程,我们定义dp[i][j]
表示以第i
个字符结尾,且'1'的个数为j
的最长子串长度。状态转移方程如下:
- 如果当前字符是'0',则dp[i][j]
= max(dp[i-1][j], dp[i-1][j-1]) + 1- 如果当前字符是'1',则dp[i][j]
= max(dp[i-1][j], dp[i-1][j+1]) + 1
代码实现
以下是使用C++实现的力扣740题的动态规划解法。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int deleteAndEarn(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; int maxVal = max_element(nums.begin(), nums.end()); vector<int> dp(maxVal + 1, 0); for (int num : nums) { int pick = num + dp[num - 1]; int nPick = dp[num]; dp[num] = max(pick, nPick); } return max_element(dp.begin(), dp.end()); } int main() { vector<int> nums = {3, 4, 2}; cout << deleteAndEarn(nums) << endl; return 0; }
案例分析
以输入[3, 4, 2]
为例,我们计算出每个数字的最大值,即4。我们初始化一个长度为5的数组dp
,并遍历输入数组,根据状态转移方程更新dp
数组。最终,返回dp
数组中的最大值,即为所求的最长子串长度。
本文详细分析了力扣740题的动态规划解题思路和步骤,并提供了C++代码实现。通过构建状态转移方程和维护状态数组,我们可以有效地解决这类问题。动态规划是一种强大的算法思想,适用于解决具有重叠子问题和最优子结构特性的问题。
原创内容 转载请注明出处