关于思路
查看原帖
关于思路
149219
_maze楼主2020/7/30 16:31

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这段时间呢?两种情况都没考虑到这种情况啊

我就不会了,有没有奆佬愿意回答一下。。。

2020/7/30 16:31
加载中...