状态机2:1057
作者:
总打瞌睡的天天啊
,
2024-10-16 19:45:22
,
所有人可见
,
阅读 2
//f[i][j][0|1]表示:只选前i个物品,交易次数为j,最大值,0表示状态为没有,1表示有
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10,M=110,INF=0x3f3f3f3f;
int f[N][M][2];
int a[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
memset(f, -0x3f, sizeof f);//
f[0][0][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
{
f[i][j][0] = f[i - 1][j][0];
if (j) f[i][j][0] = max(f[i][j][0], f[i - 1][j - 1][1] + a[i]);//因为有j-1会越界
f[i][j][1]=max(f[i-1][j][1],f[i-1][j][0]-a[i]);
}
int res = 0;
for (int j = 0; j <= k; ++ j) res = max(res, f[n][j][0]); //目标状态f[n][j][0]
cout << res << endl;
return 0;
}