简单多状态问题

class Solution {

public:

int massage(vector<int>& nums) {

int n=nums.size();

if(n==0) return 0;

vector<int> f(n);

auto g=f;

f[0]=nums[0];

for(int i=1;i<n;i++){

f[i]=g[i-1]+nums[i];

g[i]=max(f[i-1],g[i-1]);

}

return max(f[n-1],g[n-1]);

}

};

class Solution {

public:

int rob(vector<int>& nums) {

int n=nums.size();

return max(nums[0]+money(nums,2,n-2),money(nums,1,n-1));

}

int money(vector<int>&nums,int left,int right){

int n=nums.size();

if(left>right) return 0;

vector<int> f(n);

auto g=f;

f[left]=nums[left];

for(int i=left+1;i<=right;i++){

f[i]=g[i-1]+nums[i];

g[i]=max(g[i-1],f[i-1]);

}

return max(f[right],g[right]);

}

};

class Solution {

public:

int deleteAndEarn(vector<int>& nums) {

const int N=10001;

int arr[N]={0};

for(auto e :nums){

arr[e]+=e;

}

vector<int> f(N);

auto g=f;

for(int i=1;i<N;i++){

f[i]=g[i-1]+arr[i];

g[i]=max(g[i-1],f[i-1]);

}

return max(f[N-1],g[N-1]);

}

};

class Solution {

public:

int minCost(vector<vector<int>>& costs) {

int n=costs.size();

vector<vector<int>> dp(n+1,vector<int>(3));

for (int i = 1; i <= n; i++) {

dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];

dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];

dp[i][2] = min(dp[i - 1][1], dp[i - 1][0]) + costs[i - 1][2];

}

return min(dp[n][0], min(dp[n][1], dp[n][2]));

}

};

lass Solution {

public:

int maxProfit(vector<int>& nums) {

int n=nums.size();

if(n==1) return 0;

vector<vector<int>> ret(n,vector<int>(3));

//0是买入的状态,1是可交易,2是冷却期

ret[0][0]=-nums[0];

for(int i=1;i<n;i++){

ret[i][0]=max(ret[i-1][0],ret[i-1][1]-nums[i]);

ret[i][1]=max(ret[i-1][1],ret[i-1][2]);

ret[i][2]=ret[i-1][0]+nums[i];

}

return max(ret[n-1][0],max(ret[n-1][1],ret[n-1][2]));

}

};

class Solution {

public:

int maxProfit(vector<int>& nums, int fee) {

int n=nums.size();

vector<vector<int>> ret(n,vector<int>(4,-1e9));

ret[0][0]=-nums[0];

ret[0][2]=0;

//0买股票,1有股票不卖,2,没有股票也不买,3,表示卖股票

for(int i=1;i<n;i++){

ret[i][0]=max(ret[i-1][3]-nums[i],ret[i-1][2]-nums[i]);

ret[i][1]=max(ret[i-1][0],ret[i-1][1]);

ret[i][2]=max(ret[i-1][3],ret[i-1][2]);

ret[i][3]=max((ret[i-1][0]+nums[i]-fee),(ret[i-1][1]+nums[i]-fee));

}

return max(ret[n-1][2],ret[n-1][3]);

}

};

class Solution {

public:

int maxProfit(vector<int>& nums) {

int n=nums.size();

vector<vector<int>> f(n,vector<int>(3,-1e9));

auto g=f;

//f表示买入的g表示卖出

f[0][0]=-nums[0],g[0][0]=0;

for(int i=1;i<n;i++){

for(int j=0;j<3;j++){

f[i][j]=max(f[i-1][j],g[i-1][j]-nums[i]);

g[i][j]=g[i-1][j];

if(j>=1){

g[i][j]=max(g[i][j],f[i-1][j-1]+nums[i]);

}

}

}

int sum=0;

for(int i=0;i<3;i++){

sum=max(sum,g[n-1][i]);

}

return sum;

}

};

class Solution {

public:

int maxProfit(int k, vector<int>& nums) {

int n=nums.size();

k=min(k,n/2);

vector<vector<int>> f(n,vector<int>(k+1,-1e9));

auto g=f;

f[0][0]=-nums[0],g[0][0]=0;

for(int i=1;i<n;i++){

for(int j=0;j<=k;j++){

f[i][j]=max(f[i-1][j],g[i-1][j]-nums[i]);

g[i][j]=g[i-1][j];

if(j>=1){

g[i][j]=max(f[i-1][j-1]+nums[i],g[i-1][j]);

}

}

}

int sum=0;

for(int i=0;i<=k;i++){

sum=max(sum,g[n-1][i]);

}

return sum;

}

};

相关推荐
IronMurphy1 天前
【算法四十三】279. 完全平方数
算法
墨染天姬1 天前
【AI】Hermes的GEPA算法
人工智能·算法
papership1 天前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826521 天前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
山甫aa1 天前
差分数组 ----- 从零开始的数据结构
数据结构
早日退休!!!1 天前
《数据结构选型指南》笔记
数据结构·数据库·oracle
Beginner x_u1 天前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
丑八怪大丑1 天前
Java数据结构与集合源码
数据结构
_深海凉_1 天前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录1 天前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode