Acwing 状态机模型打卡
1049. 大盗阿福
https://www.acwing.com/problem/content/1051/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+5;
int a[N];
int f[N][2];
int T;
int n;
int main(){
cin>>T;
while(T--){
cin>>n;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
f[i][0]=max(f[i-1][0],f[i-1][1]);
f[i][1]=f[i-1][0]+a[i];
}
cout<<max(f[n][0],f[n][1])<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);
1057. 股票买卖 IV
https://www.acwing.com/problem/content/1059/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+5;
int f[N][110][2];//f(i,j,1) 前i个物品交易次数为j 0表示卖出 1表示买进
int w[N];
int n,k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>w[i];
}
memset(f,-0x3f,sizeof f);
for(int i=0;i<=n;i++) f[i][0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]+w[i]);
f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-w[i]);
}
}
int res=0;
for(int i=1;i<=k;i++){
res=max(res,f[n][i][0]);
}
cout<<res<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
1058. 股票买卖 V
https://www.acwing.com/problem/content/1060/
状态模型图:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+5,INF=0x3f3f3f3f;
int w[N];
int n;
int f[N][3];
int main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
f[0][0]=f[0][1]=-INF;
for(int i=1;i<=n;i++){
f[i][0]=max(f[i-1][0],f[i-1][2]-w[i]);
f[i][1]=f[i-1][0]+w[i];
f[i][2]=max(f[i-1][1],f[i-1][2]);
}
printf("%d\n", max(f[n][1], f[n][2]));
return 0;
}
// freopen("testdata.in", "r", stdin);

浙公网安备 33010602011771号