传送门 :
题意购买和卖出 求最大利润问题 限制条件 : 当前有股票时,只能进行卖出操作无法再度买入
设计状态 : f [ i ] [ j ] [ 2 ] f[i][j][2] f[i][j][2]表示第 i i i天的时候,已经进行了 j j j次交易,当前手上是否有股票
显然状态转移如下 :
- 当前没有股票
f
[
i
]
[
j
]
[
0
]
=
m
a
x
(
f
[
i
−
1
]
[
j
]
[
0
]
,
f
[
i
−
1
]
[
j
]
[
1
]
+
w
[
i
]
)
f[i][j][0] = max(f[i-1][j][0],f[i-1][j][1]+w[i])
f[i][j][0]=max(f[i−1][j][0],f[i−1][j][1]+w[i])
- 从上一次没有股票的地方中转移
- 就是在当前这天已经卖掉了
- 当前有股票
f
[
i
]
[
j
]
[
1
]
=
m
a
x
(
f
[
i
−
1
]
[
j
]
[
1
]
,
f
[
i
−
1
]
[
j
−
1
]
[
0
]
−
w
[
i
]
)
f[i][j][1] =max(f[i-1][j][1],f[i-1][j-1][0]-w[i])
f[i][j][1]=max(f[i−1][j][1],f[i−1][j−1][0]−w[i])
- 上一次买入的股票就没有卖出 2.当天购入股票
最后在枚举一下所有的购买次数,取得最大利润即可
CODE#include
#include
#include
#include
#include
#include
using namespace std;
#define IOS ios::sync_with_stdio(false);
#define CIT cin.tie(0);
#define COT cout.tie(0);
#define ll long long
#define x first
#define y second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),x.end()
typedef priority_queue Pri_m;
typedef pair pii;
typedef vector VI;
map mp;
const int N = 1e5+10,M = 110;
int f[N][M][2];
//当前第i天,交易了j次,目前是否有股票
int n,k;
int w[N];
void init(){
//进行初始化
memset(f,-0x3f,sizeof f);
for(int i=0;i>n>>k;
for(int i=1;i>w[i];
init();
for(int i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?