#include<iostream>#include<algorithm>#include<cstring>using namespace std;constint N =10010;constint K =110;int w[N],k,n;int f[N][K][2];intmain(){cin>>n>>k;for(int i =0; i < n;++i){cin>>w[i];}// 遍历所有的边界进行赋值memset(f,0,sizeof(f));// for (int i = 0; i <= k; ++i) {// f[0][k][0] = 0;// f[0][k][1] = 0;// }// // 遍历所有零次交易的情况// for (int i = 0; i <= n; ++i) {// f[k][0][0] = 0;// f[k][0][1] = 0;// }for(int i =1; i <= n;++i){for(int j =1; j <= k;++j){f[i][j][0]=max(f[i -1][k][0], f[i -1][k][1]+ w[i]);f[i][j][1]=max(f[i -1][k][1], f[i -1][k-1][0]- w[i]);}}cout<<max(f[n][k][0],f[n][k][1])<<endl;}
参考代码
大体是一样,但是有两个问题,分别
最大值的确定
最后肯定是全部都卖光的情况,手里没有持有股票才对,所以只需要比价状态0就行了
最后有可能交易次数没有用光,所以可能要遍历最后一天所有交易次数的情况
关于初始化的问题
因为有可能 是负数,所以最开始的初始值要是最小的。
因为再交易过程中,交易天数会为0,同时交易次数也会为0,因为都存在-1的情况,所以要对两者进行判定
在第零天第零次交易的情况下,自身的收益本身就是0,存在f[i-1][j-1][0]的情况
#include<iostream>#include<algorithm>#include<cstring>using namespace std;constint N =10010;constint K =110;int w[N],k,n;int f[N][K][2];intmain(){cin>>n>>k;for(int i =0; i < n;++i){cin>>w[i];}// 遍历所有的边界进行赋值memset(f, INT_MIN,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][k][0], f[i -1][k][1]+ w[i]);f[i][j][1]=max(f[i -1][k][1], f[i -1][k-1][0]- w[i]);}}int res =0;for(int i =0; i <= k;++i){res =max(res, f[n][i][0]);}cout<<res<<endl;}
#include<iostream>#include<algorithm>#include<vector>usingnamespace std;intmaxConsecutiveAnswers1(string s,int k,char t){int n = s.size();int res =0;for(int l =0,r =0,sum =0; r < n;r ++){if(s[r]!= t) sum ++;while(sum > k){if(s[l]!= t) sum --;l ++;}res =max(res , r - l +1);}return res;}intmaxConsecutiveAnswers(string s,int k){returnmax(maxConsecutiveAnswers1(s,k,'F'),maxConsecutiveAnswers1(s,k,'T'));}intmain(){cout<<maxConsecutiveAnswers("TTFF",2)<<endl;}