直接分析状态:
1.持有股票
2.不持有股票
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
vector<vector<int>> dp(prices.size(),vector<int>(2,0));
dp[0][0]=-prices[0];
for(int i=1;i<prices.size();i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
}
return max(dp[dp.size()-1][0],dp[dp.size()-1][1]);
}
};
?dp表示当前区间内最长递增子序列的长度,在满足当前nums值大于区间内某一nums值的前提下,寻找当前区间内最长递增子序列的长度。dp[i]=max(dp[i],dp[j]+1)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size(),1);
int ans=1;
for(int i=1;i<nums.size();i++)
{
for(int j=0;j<i;j++)
{
if(nums[i]>nums[j])
dp[i]=max(dp[i],dp[j]+1);
}
ans=max(ans,dp[i]);
}
return ans;
}
};
声明数组dp,表示当前区间最长连续递增序列的长度。如果当前nums值大于前一个nums值,那么当前区间?最长连续递增序列的长度就等于前一个的长度加1
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
vector<int> dp(nums.size(),1);
int ans=1;
for(int i=1;i<nums.size();i++)
{
if(nums[i]>nums[i-1])
dp[i]=dp[i-1]+1;
ans=max(ans,dp[i]);
}
return ans;
}
};