想到了一个不用背包的思路
查看原帖
想到了一个不用背包的思路
499231
Jacky2009楼主2023/7/22 17:55

核心代码如下:(反作弊)

flag=1;
		for(int j=0;j<x[i-1];j++){
			minn[j][0]=1145141919810;
			for(int k=1;k<=siz[j];k++){
				minn[j][k]=min(min[j][k-1],mp[j][k]);
			}
		}
		for(int j=1;j<=m;j++){
			dp[i][j]=1145141919810;
			if(j<=l[i]||j>=h[i]&&h[i]!=0){
				continue;
			}
			if(j!=m){
				int orgp=(j%x[i-1]?j%x[i-1]:x[i-1]),step=(j-orgp)/x[i-1],top=orgp+(m-orgp)/x[i-1]*x[i-1];
				dp[i][j]=min(dp[i][j],minn[orgq%x[i-1]][step]+siz[orgp%x[i-1]]-(top-j)/x[i-1]);
			}
			else{
				for(int k=1;k<=m;k++)dq[i][j]=min(dp[i][j],dp[i-1][k]+(k=m?1:((m-k)%x[i-1]=0?(m-k)/x[i-1]:(m-k)/x[i-1]+1)));
			}
			if(j+y[i-1]<=m){
				dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]);
			}
			if(i==n)ans=min(ans,dp[i][j]);
			if(dp[i][j]<10000000ll&&h[i]!=0&&flg){
				kmt++;flag=0;
			}
			
		}	

如上,给dp值加一个偏移量方便维护每一个可能转移到这个点的点的贡献,最上面一排直接暴力

2023/7/22 17:55
加载中...