当前位置:首页 > 力扣题解 > 力扣740题动态规划的解题思路和步骤 C++代码实现 力扣每题自带的代码是什么

力扣740题动态规划的解题思路和步骤 C++代码实现 力扣每题自带的代码是什么

3周前 (05-10)力扣题解70

本文将深入探讨力扣740题——动态规划的解题思路和步骤,并提供C++代码实现。



动态规划基础


动态规划(Dynamic Programming,简称DP)是一种算法思想,用于解决具有重叠子问题和最优子结构特性的问题。在力扣740题中,我们面临的是一个典型的动态规划问题。动态规划的核心在于将问题分解为更小的子问题,并存储这些子问题的解,避免重复计算。


在实际应用中,动态规划通常涉及状态转移方程的构建,它描述了问题的最优解是如何由其子问题的最优解构成的。通过这种方式,我们可以自底向上地构建问题的解决方案。


问题分析


力扣740题要求我们找出在一个由'0'和'1'组成的二进制字符串中,最长的连续子串,使得连续子串中'1'的个数不大于'0'的个数。这个问题可以通过动态规划来解决,我们需要维护一个状态数组,记录到当前位置为止,满足条件的最长子串长度。


具体我们需要跟踪两个状态:一是当前位置结束的子串中'1'的个数,二是'0'的个数。通过这两个状态,我们可以推导出下一个状态,并更新最长子串长度。

截图未命名.jpg 力扣740题动态规划的解题思路和步骤 C++代码实现 力扣每题自带的代码是什么 力扣 动态规划 算法 C++ 数组 二进制 进制转换 第1张


状态转移方程


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


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。