——个人学习笔记
——个人感觉这个DP算法是很灵活的,这种要多思考怎么用,以下几种都是找到关系直接得出结果的问题。
背包问题:
- 我的学习之地:https://www.jianshu.com/p/19cd90b6c92d
——表格法,行表示物品,列表示包容量,数值表示当前这个包容量的最大价值,运算到最后的一行的最大值就是结果。表格中的值的取法就是max(此容量上一行的价值,该物品价值+剩余容量的价值),如果该物品容量超于该列容量树怎直接取得上一行的价值。
背包公式:
序列最大问题:
-
题目leetcode53:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
-思路:这个要找出连续的最大和,即从左往右,找最大值。那么,我们可以用一个res来记录前N个中最大值,用一个sum来记录前面连续(包含nums[i-1])的最大值(有点绕,可以稍微理解一下,或者看代码),那么我们就对比sum和sum+nums[i]的值,大的在赋值给sum,然后再对比sum和res,大值赋值给res,最终res就是结果。 -
C++代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0) return NULL;
int res = INT_MIN;
int sum = -1;
for(int i = 0; i < nums.size(); ++i)
{
sum = max(nums[i], sum + nums[i]);
res = max(sum, res);
}
return res;
}
};
最长回文子序列:
- 最长回文子序列LeetCode516:https://leetcode-cn.com/problems/longest-palindromic-subsequence/
- 思路:
- C++代码:
class Solution {
public:
int longestPalindromeSubseq(string s) {
vector<vector<int>> dp(s.length(),vector<int>(s.length()));
for(int i=s.length()-1;i>=0;i--)
{
dp[i][i]=1;
for(int j=i+1;j<s.length();j++)
{
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1]+2;
else
dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
}
}
return dp[0][s.length()-1];
}
};