大师课T2 WA on test 9 求调

#include <bits/stdc++.h>
#define int long long
using namespace std;
int k,ans=0;
int a[3005][3005],dp[3005],tp[20][3005],t[3005];
void solve(int l,int r,int d){
	if(l==r){
		for(int i=0;i<=t[l];i++){
			ans=max(ans,a[l][i]+dp[k-i]);
		}
		return;
	}
	int mid=(l+r)/2;
	for(int i=0;i<=k;i++){
		tp[d][i]=dp[i];
	}
	for(int i=l;i<=mid;i++){
		for(int j=k;j>=t[i];j--){
			if(j>=t[i]&&j-t[i]<=k){
				dp[j]=max(dp[j],dp[j-t[i]]+a[i][t[i]]);
			}
		}
	}
	solve(mid+1,r,d+1);
	for(int i=0;i<=k;i++){
		dp[i]=tp[d][i];
	}
	for(int i=mid+1;i<=r;i++){
		for(int j=k;j>=t[i];j--){
			if(j>=t[i]&&j-t[i]<=k){
				dp[j]=max(dp[j],dp[j-t[i]]+a[i][t[i]]);
			}
		}
	}
	solve(l,mid,d+1);
	for(int i=0;i<=k;i++){
		dp[i]=tp[d][i];
	}
}
signed main(){
	int n;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>t[i];
		for(int j=1;j<=t[i];j++){
			if(j<=k){
				cin>>a[i][j];
				a[i][j]+=a[i][j-1];
			}else{
				break;
			}
			if(t[i]>k){
				t[i]=k;
			}
		}
	}
	solve(1,n,0);
	cout<<ans;
}

image

@吴梓峤 @charlieqi @王峥睿

这个不能放在这里,要放内循环外面,不然内循环次数会有问题

还有你这里输入次数会有问题

TLE 了。。。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
int k,ans=0;
int a[3005][3005],dp[3005],tp[20][3005],t[3005];
void solve(int l,int r,int d){
	if(l==r){
		for(int i=0;i<=t[l];i++){
			ans=max(ans,a[l][i]+dp[k-i]);
		}
		return;
	}
	int mid=(l+r)/2;
	for(int i=0;i<=k;i++){
		tp[d][i]=dp[i];
	}
	for(int i=l;i<=mid;i++){
		for(int j=k;j>=t[i];j--){
			if(j>=t[i]&&j-t[i]<=k){
				dp[j]=max(dp[j],dp[j-t[i]]+a[i][t[i]]);
			}
		}
	}
	solve(mid+1,r,d+1);
	for(int i=0;i<=k;i++){
		dp[i]=tp[d][i];
	}
	for(int i=mid+1;i<=r;i++){
		for(int j=k;j>=t[i];j--){
			if(j>=t[i]&&j-t[i]<=k){
				dp[j]=max(dp[j],dp[j-t[i]]+a[i][t[i]]);
			}
		}
	}
	solve(l,mid,d+1);
	for(int i=0;i<=k;i++){
		dp[i]=tp[d][i];
	}
}
signed main(){
	
	int n;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>t[i];
		for(int j=1;j<=t[i];j++){
			if(j<=k){
				cin>>a[i][j];
				a[i][j]+=a[i][j-1];
			}else{
				for(int p=j;p<=t[i];p++){
					int x;
					cin>>x;
				}
				break;
			}
		}
		if(t[i]>k){
			t[i]=k;
		}
	}
	solve(1,n,0);
	cout<<ans;
}

稍等,我需要点时间看看

我的意思是说,你的a[i][j]输入不要放在if内,拿出来就好了

AC了,加个

ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

就行

1 个赞

@LeuR 关帖!