继续之前的练习,牛客网上两道比较简单的动态规划题,复习之前学的内容
题目一: 子数组的最大累加和问题
题目内容:
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
样例:
输入
[1, -2, 3, 5, -2, 6, -1]
返回值
12
解题过程:
动态规划的3个步骤:1. 设定状态 2. 推导方程 3. 起始值和输出
这里dp[i] 表示当前最大的子数组累加和,以是否选用当前的数作为推导方程,起始值为零,代码如下:
int dp[100005] = {0};
dp[i] = max(arr[i],dp[i-1] + arr[i]);
状态为当前最大的子数组累加和(往后看),不是整个数组最大的子数组累加和,输出值为dp数组中最大的那个数,用一次循环解决:
int m = 0;
for(int i=0;i<arr.size();i++){
if(dp[i] > m) m = dp[i];
}
全部代码:
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
int dp[100005] = {0};
for(int i=0;i<arr.size();i++){
if(i==0 && arr[i]>0){
dp[i] = arr[i];
continue;
}
dp[i] = max(arr[i],dp[i-1] + arr[i]);
}
int m = 0;
for(int i=0;i<arr.size();i++){
if(dp[i] > m) m = dp[i];
}
return m;
}
};
题目二: 买卖股票的最佳时机
题目内容:
假设你有一个数组,其中第 个元素是股票在第 天的价格。
你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。
样例:
输入
[1,4,2]
输出
3
全部代码:
class Solution {
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// write code here
int m = 0;
for(int i=1;i<prices.size();i++){
for(int j=i-1;j>=0;j--){
if(prices[i]-prices[j] > m) m = prices[i]-prices[j];
}
}
return m;
}
};