RT,今天我们的毒瘤老师让我们做这题。我一看以前做过,就重写了一份交了上去,过了。
#include<bits/stdc++.h>
using namespace std;
int n,b,a[3831],dp[3831][3831][2],maxx;
int main(){
int t;
// cin>>t;
// while(t--){
maxx=0;
cin>>n>>b;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dp,0X80,sizeof(dp));
dp[1][0][0]=0;
dp[1][1][1]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=min(i,b);j++){
dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0]);
if(j>=1){
dp[i][j][1]=max(dp[i-1][j-1][1]+a[i],dp[i-1][j-1][0]);
}
}
}
maxx=dp[n][b][0];
memset(dp,0X80,sizeof(dp));
dp[1][0][0]=0;
dp[1][1][1]=a[1];
for(int i=2;i<=n;i++){
for(int j=0;j<=min(i,b);j++){
// cout<<"qunimade"<<endl;
dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0]);
if(j>=1){
dp[i][j][1]=max(dp[i-1][j-1][1]+a[i],dp[i-1][j-1][0]);
}
}
}
maxx=max(maxx,dp[n][b][1]);
cout<<maxx<<endl;
// }
}
显然,在这个代码里我运行了两次DP。其中一次1睡觉为首睡,不管用,另一次1睡觉管用,但n必须睡觉。
然后又一个毒瘤奆佬提了个问题:假如正确答案是睡n-3~1这段时间呢?两种情况都没考虑到这种情况啊
我就不会了,有没有奆佬愿意回答一下。。。