浅学动态规划算法后,为了巩固知识,找了以下问题练习:
1. 最大子序和
【题目描述】
【动态规划解题思路】
【代码实现】
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int numSize = nums.size();
vector <int> dp(numSize); //dp[i]表示nums中以nums[i]结尾的最大子序和
dp[0] = nums[0];
int MaxSum = dp[0];
for (int i = 1; i < numSize ; i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
MaxSum = max(MaxSum, dp[i]);
}
return MaxSum;
}
};
//空间优化下 - 不需要开辟空间 - 下面例题方可
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int numSize = nums.size();
int TmpSum = nums[0];
int MaxSum = nums[0];
for (int i = 1; i < numSize ; i++)
{
TmpSum = max(TmpSum + nums[i], nums[i]);
MaxSum = max(MaxSum, TmpSum);
}
return MaxSum;
}
};
2. 连续最大数组和
【题目描述】
【代码实现】
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int size = nums.size();
int* dp = new int[size];
dp[0] = nums[0];
int MaxNum = dp[0];
for (int i = 1; i < size; ++i)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
MaxNum = max(MaxNum, dp[i]);
}
return MaxNum;
}
};
3. 连续最大和
【题目描述】
【代码实现】
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i];
vector<int> dp(n); //dp[i]是以v[i]结尾的子数组的最大和
dp[0] = v[0];
int res = dp[0];
for (int i = 1; i < n; ++i)
{
dp[i] = max(dp[i - 1] + v[i], v[i]);
res = max(res, dp[i]);
}
cout << res << endl;
return 0;
}