玄学做法
查看原帖
玄学做法
1000415
wzc6666楼主2024/7/19 08:59

这是100ptsWAhack数据的代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100][30];
int dp[(1<<10)+114514];
int main(){
	cin>>n>>m;
	for(int i = 1;i<=m;i++){
		for(int j = 1;j<=n;j++){
			cin>>a[i][j]; 
		}
	}
	for(int i = 1;i<=(1<<n);i++){
		dp[i] = 0x3f3f3f;
	}
	for(int i = 0;i<(1<<n);i++){
		if(dp[i]==0x3f3f3f){
			continue;
		}
		for(int j = 1;j<=m;j++){
			int k = i;
			for(int l = 1;l<=n;l++){
				if(a[j][l]==1){
					if(!((k>>(l-1))&1)){
						k+=(1<<(l-1));
					}
				}else if(a[j][l]==-1){
					if((k>>(l-1))&1){
						k-=(1<<(l-1));
					}
				}
			}
			dp[k] = min(dp[k],dp[i]+1);
		}
		cout<<dp[i]<<" ";
	}
	if(dp[(1<<n)-1]==0x3f3f3f){
		puts("-1");
	}else{
		cout<<dp[(1<<n)-1];
	}
	return 0;
}

然后我把dp复制了一下

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100][30];
int dp[(1<<10)+114514];
int main(){
	cin>>n>>m;
	for(int i = 1;i<=m;i++){
		for(int j = 1;j<=n;j++){
			cin>>a[i][j]; 
		}
	}
	for(int i = 1;i<=(1<<n);i++){
		dp[i] = 0x3f3f3f;
	}
	for(int i = 0;i<(1<<n);i++){
		if(dp[i]==0x3f3f3f){
			continue;
		}
		for(int j = 1;j<=m;j++){
			int k = i;
			for(int l = 1;l<=n;l++){
				if(a[j][l]==1){
					if(!((k>>(l-1))&1)){
						k+=(1<<(l-1));
					}
				}else if(a[j][l]==-1){
					if((k>>(l-1))&1){
						k-=(1<<(l-1));
					}
				}
			}
			dp[k] = min(dp[k],dp[i]+1);
		}
	}
	for(int i = 0;i<(1<<n);i++){
		if(dp[i]==0x3f3f3f){
			continue;
		}
		for(int j = 1;j<=m;j++){
			int k = i;
			for(int l = 1;l<=n;l++){
				if(a[j][l]==1){
					if(!((k>>(l-1))&1)){
						k+=(1<<(l-1));
					}
				}else if(a[j][l]==-1){
					if((k>>(l-1))&1){
						k-=(1<<(l-1));
					}
				}
			}
			dp[k] = min(dp[k],dp[i]+1);
		}
	}
	if(dp[(1<<n)-1]==0x3f3f3f){
		puts("-1");
	}else{
		cout<<dp[(1<<n)-1];
	}
	return 0;
}

AC了,这个方法到底是否正确? 还是说数据太水?

2024/7/19 08:59
加载中...