二刷提高课,题解目录在这里— 提高课的题解目录
这里多了条限制,也就是我们最多只能完成k场交易
这就导致不能用贪心来解决,因为会浪费很多交易的次数
注意:这里需要多加一维k来表示进行交易的次数,否则会无法确定这是第几次交易产生混沌
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int f[N][110][2];
int n,k;
int main()
{
cin>>n>>k;
memset(f,-0x3f,sizeof f);
f[0][0][0]=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
f[i][0][0]=0;
for(int j=1;j<=k;j++)
{
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]+x);
f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-x);
}
}
int res=0;
for(int i=0;i<=k;i++)res=max(res,f[n][i][0]);
cout<<res;
return 0;
}
我就是有点不太理解j之间的关系,感觉y总那里一下讲得有点只能意会不能言传的感觉