悬赏一关注,DP 60pts求查错
查看原帖
悬赏一关注,DP 60pts求查错
352426
就决定是你辣楼主2022/10/12 18:56

跟讨论区的错误点相反...代码时间5h,看不出来了TAT

#include<bits/stdc++.h>
using namespace std;
int f[10005][2005];
int l[10005],h[10005];
int ko[10005];
int ans,ans1=0x3f3f3f3f;
int up[10005],dow[10005];
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++)h[i]=m+1;
	for(int i=1;i<=n;i++){
		cin>>up[i]>>dow[i];
	}
	for(int i=1;i<=k;i++){
		int p;
		scanf("%d",&p);
		scanf("%d %d",&l[p],&h[p]);
		ko[p]=1;
}
	for(int t=0;t<=n;t++){
		f[0][t]=0;
		ko[t]+=ko[t-1];
	}
	for(int i=1;i<=n;i++){
		for(int j=up[i]+1;j<=m;j++){
			if(j==m){
				for(int g=m;g>=m-up[i];g--){
					f[i][j]=min(f[i-1][g]+1,f[i][j]);
					f[i][j]=min(f[i][j],f[i][g]+1);
				}
			}
			f[i][j]=min(f[i][j-up[i]]+1,f[i][j]);
			f[i][j]=min(f[i-1][j-up[i]]+1,f[i][j]);
		}
		for(int j=1;j<=m;j++){
			f[i][j]=min(f[i-1][j+dow[i]],f[i][j]);
			if(j>l[i]&&j<h[i]&&f[i][j]<0x3f3f3f3f){
				ans=i;
				if(i==n){
					ans1=min(ans1,f[i][j]);
				}
			}
		}
		if(ans!=i){
			cout<<0<<endl;
			cout<<ko[i-1];
			return 0;
		}
		for(int j=0;j<=l[i];j++)
			f[i][j]=0x3f3f3f3f; 
		for(int j=m;j>=h[i];j--)
			f[i][j]=0x3f3f3f3f; 
	}
	int ans2=0;
	if(ans==n){
		cout<<1<<endl<<ans1<<endl;
	}
	else {
		cout<<0<<endl<<ans2<<endl; 
	} 
}
2022/10/12 18:56
加载中...