#include#include#include
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#include#include
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;}
classSolution{public:intmaxConsecutiveAnswers(string s,int k){int n = s.size(),kTemp = k;int res =0;for(int l =0; l < n;l ++){int r = l+1;while(r < n &&(s[l]== s[r]|| kTemp >0)){if(s[l]!= s[r]){
kTemp --;}
r ++;}
res =max(res,r - l );// 重置并重新移动lwhile(l +1< n && s[l]== s[l +1]) l++;
kTemp = k;}
kTemp = k;for(int r = n -1; r >=0;r --){int l = r -1;while(l >=0&&(s[l]== s[r]|| kTemp >0)){if(s[l]!= s[r]){
kTemp --;}
l --;}
res =max(res,r - l );// 重置并重新移动lwhile(r -1>=0&& s[r]== s[r -1]) r --;
kTemp = k;}return res;}};
#include#include#includeusingnamespace 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;}