简单多状态问题

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;

}

};

相关推荐
计算机安禾2 小时前
【数据结构与算法】第38篇:图论(二):深度优先搜索(DFS)与广度优先搜索(BFS)
数据结构·算法·矩阵·排序算法·深度优先·图论·宽度优先
佑白雪乐2 小时前
<LeetCode>二叉树前/中/后/层遍历**递归&&非递归**
算法·leetcode·深度优先
汀、人工智能2 小时前
[特殊字符] 第56课:在排序数组中查找元素的首末位置
数据结构·算法·数据库架构·图论·bfs·在排序数组中查找元素的首末位置
小O的算法实验室2 小时前
2026年IEEE TASE,面对突发危险区域的基于强化学习的多无人机路径规划,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
AI科技星2 小时前
全维度相对论推导、光速螺旋时空与北斗 GEO 钟差的统一理论
开发语言·线性代数·算法·机器学习·数学建模
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 279. 完全平方数 | C++ 动态规划 (完全背包)
c++·leetcode·动态规划
ECT-OS-JiuHuaShan2 小时前
科学的本来意义,是基于规范的共识逻辑,而非共识方法
人工智能·科技·学习·算法·生活
木子墨5162 小时前
LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III
数据结构·c++·算法·leetcode·动态规划·力扣
li1670902702 小时前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio