力扣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++代码实现。通过构建状态转移方程和维护状态数组,我们可以有效地解决这类问题。动态规划是一种强大的算法思想,适用于解决具有重叠子问题和最优子结构特性的问题。
原创内容 转载请注明出处
