悬赏1关注 求助 记忆化搜索
查看原帖
悬赏1关注 求助 记忆化搜索
231946
CuSO4_and_5H2O楼主2022/10/8 22:28

RT,想拿部分分(快考试了嘛),但是一直不知道错在哪里,55分,正常来说应该是70pts,错在第四个点上,也没有题解写记忆化所以只能求助了

这个苦逼明天上whk了,周三晚上绝对给给为大佬点上关注!

谢谢,这种感觉真的好憋得慌

#include<bits/stdc++.h>
#define max(A,B) (A<B?B:A)
#define min(A,B) (A>B?B:A)
#define bug cout<<"I AK IOI"<<endl;
#define gc getchar
using namespace std;
const int N=1e4+100;

inline void print(int x) {if (x < 0) putchar('-'), x = -x; if(x > 9) print(x / 10); putchar(x % 10 + '0');}
inline int read(){int res = 0, f = 0; char ch = gc();for(; !isdigit(ch); ch = gc()) f |= (ch == '-'); for(;isdigit(ch);ch=gc()) res = (res << 1) + (res << 3) + (ch ^ '0');return f ? -res :res;}

int n,m,k,ans=1e9,jil[N];
struct node{
	int onn,inn;
}w[N],zb[N];
int f[1005][105];
int Max=-1;

inline int dfs(int x,int y,int jis)
{
//	cout<<x<<endl;
	Max=max(Max,x);
	if(jis>=ans) return 1e9;
	if(y-w[x].inn>0 && (!jil[x+1] || (y-w[x].inn>zb[x+1].inn && y-w[x].inn<zb[x+1].onn))){
		if(f[x+1][y-w[x].inn]!=1e9) f[x][y]=f[x+1][y-w[x].inn];
		else f[x][y]=min(f[x][y],dfs(x+1,y-w[x].inn,jis));
	}
	for(int i=1,j=y+w[x].onn;;i++,j+=w[i].onn)
	{
		if(j>m) j=m;
		if(jil[x+1] && (j<=zb[x+1].inn || j>=zb[x+1].onn)) {
			if(j<m) continue ;
			else break;
		}
		if(f[x+1][j]!=1e9) f[x][y]=min(f[x][y],f[x+1][j]+i);
		else f[x][y]=min(f[x][y],i+dfs(x+1,j,jis+i));
		if(j>=m) break ;
	}
	return f[x][y];
}

signed main(){
	int a,b,c;
	n=read(),m=read(),k=read();
//	if(n==500 and m==50 and k==26){
//		cout<<0<<endl<<14;
//		return 0;
//	}
	for(int i=1;i<=n;i++){
		a=read(),b=read();
		w[i]=node{a,b};
		for(int j=1;j<=m;j++) f[i][j]=1e9;
	}
	for(int i=1;i<=k;i++)
	{
		a=read(),b=read(),c=read();
		++a;
		zb[a]=node{c,b};jil[a]=1;
	}
	for(int i=1;i<=m;i++){
		if(jil[1] && (i>=zb[1].onn || i<=zb[1].inn)) continue ;
		f[1][i]=dfs(1,i,0);
		ans=min(ans,f[1][i]);
	}
//	cout<<f[10][2]<<endl; 
	if(ans==1e9){
		int qwq=0;
	 	for(int i=1;i<Max;i++) if(jil[i]) qwq++;
		printf("0\n%d",qwq);		
	}
	else printf("1\n%d",ans);
}
 


2022/10/8 22:28
加载中...