简单多状态问题

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;

}

};

相关推荐
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue7 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao8 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路8 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星8 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑8 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光9 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩9 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_629494739 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表