社区讨论

状态压缩dp求调 样例没过,输出偏小

P10865[HBCPC2024] Genshin Impact Startup Forbidden III参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjkgijt
此快照首次捕获于
2025/11/04 04:02
4 个月前
此快照最后确认于
2025/11/04 04:02
4 个月前
查看原帖
代码如下:
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<iomanip>
using namespace std;
int n,m,k,cur;
int mp[1010][1010],p[1010][1010];
int t[110],cnt;
int X[5]={0,0,1,0,-1};
int Y[5]={0,1,0,-1,0};
int dp[1<<21];
int lowbit(int x){
	return x&-x;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++){
		int x,y,a;
		cin>>x>>y>>a;
		mp[x][y]=a;
	}
	int st=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			p[i][j]=cur;
			st+=mp[i][j]*(1<<cur)*(1<<cur); 
			cur++;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int q=0;
			for(int kk=0;kk<5;kk++){
				int ni=i+X[kk],nj=j+Y[kk];
				if(mp[ni][nj]){
					q+=(1<<p[ni][nj]);
				}
			} 
			t[++cnt]=q;
		}
	}
	memset(dp,0x3f,sizeof(dp));
	dp[st]=0;
	for(int i=st;i>=0;i--){
		if(dp[i]==0x3f3f3f3f){
			continue;
		}
		for(int j=1;j<=cnt;j++){
			int nxt=i;
			int now=t[j];
			while(now){
				int l=lowbit(now);
				//cout<<l<<' '<<i<<"   "<<(i&(3*l*l))<<endl;
				now-=l;
				if(i&(3*(l*l))){
					//cout<<'!'; 
					nxt-=l*l;
				}
			}
			dp[nxt]=min(dp[i]+1,dp[nxt]);
		}
	}
	/*for(int i=1;i<=st;i++){
		cout<<dp[i]<<' ';
	}*/
	cout<<dp[0];
	return 0; 
}

回复

0 条回复,欢迎继续交流。

正在加载回复...