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

posted @ 2021-05-25 15:06  一个经常掉线的人  阅读(51)  评论(0)    收藏  举报