


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;
}
};