MnZn简单dp 75pts求条
查看原帖
MnZn简单dp 75pts求条
933802
ICU152_lowa_IS8楼主2025/2/1 04:02
#include<bits/stdc++.h>
using namespace std;
struct node{
	int p,l,h;
}a[100005];
struct nd{
	int x,y;
}b[100005];
int dp[10005][1505];
map<int,pair<int,int> >mp;
bool cmp(node a,node b){
	return a.p<b.p;
}
int nowp;
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		cin>>b[i].x>>b[i].y;
		mp[i]=make_pair(0,0x3f3f3f3f);
	}
	mp[n+1]=make_pair(0,0x3f3f3f3f);
	for(int i=1;i<=k;i++){
		cin>>a[i].p>>a[i].l>>a[i].h;
		a[i].p++;
		mp[a[i].p]=make_pair(a[i].l,a[i].h);
	}
	sort(a+1,a+k+1,cmp);
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=m;i++){
		dp[1][i]=0;
	}
	nowp=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(j+b[i].x<mp[i+1].second&&j+b[i].x>mp[i+1].first){
				dp[i+1][min(j+b[i].x,m)]=min(dp[i+1][min(j+b[i].x,m)],dp[i][j]+1);
			}
		}
		for(int j=1;j<=m;j++){
			if(j+b[i].x<mp[i+1].second&&j+b[i].x>mp[i+1].first){
				dp[i+1][min(j+b[i].x,m)]=min(dp[i+1][min(j+b[i].x,m)],dp[i+1][j]+1);
			}
		}
		for(int j=m;j>=1;j--){
			if(j-b[i].y>0){
				if(j-b[i].y<mp[i+1].second&&j-b[i].y>mp[i+1].first){
					dp[i+1][j-b[i].y]=min(dp[i+1][j-b[i].y],dp[i][j]);
				}
			}
		}
	}
	int ed=1,minn=0;
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=m;j++){
			if(dp[i][j]!=0x3f3f3f3f){
				if(i>ed){
					ed=i;
					minn=dp[i][j];
				}
				else{
					minn=min(minn,dp[i][j]);
				}
			}
		}
	}
//	cout<<ed<<endl;
	if(ed==n+1){
		cout<<1<<endl<<minn;
	}
	else{
		cout<<0<<endl;
		for(int i=1;i<=k;i++){
			if(a[i].p>ed){
				cout<<i-1;
				return 0;
			}
		}
	}
	return 0;
}
2025/2/1 04:02
加载中...