社区讨论

蒟蒻求改

UVA11795Mega Man's Mission参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi6z1vde
此快照首次捕获于
2025/11/20 13:09
4 个月前
此快照最后确认于
2025/11/20 13:09
4 个月前
查看原帖
为什么过不去……我在udebug找了一组数据是能过的啊
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

int T; 
const int MAX=(1<<16);
int n;
int weapon[20];
int start;
ll d[MAX];
int beat[MAX];
char S[20];

int find(int s){
	if(beat[s]!=-1)return beat[s];
	int i;
	int ans=start;
	for(i=0;i<n;i++)
		if((1<<i)&s)
			ans|=weapon[i];
	return beat[s]=ans;
}

int read(){
	scanf("%s",S);
	//printf("%s\n",S);
	int ans=0;
	int i;
	for(i=0;i<n;i++)
		if(S[i]=='1')
			ans|=(1<<i);
	return ans;
}




int main(){
	freopen("Uva.in","r",stdin);
	scanf("%d",&T);
	int o;
	for(o=1;o<=T;o++){
		scanf("%d",&n);
		memset(beat,-1,sizeof(beat));
		memset(d,0,sizeof(d));
		memset(weapon,0,sizeof(weapon));
		int i,j;
		start=read();
		for(i=0;i<n;i++)
			weapon[i]=read();
		int all=(1<<n)-1;
		d[0]=1;
		for(i=1;i<=all;i++)
			for(j=0;j<n;j++)
				if(i&(1<<j)){
					int before=i^(1<<j);
					int w=find(before);
					if(w&(1<<j))
						d[i]+=d[before];
				}
		//for(i=0;i<n;i++)
		//	printf("%d ",weapon[i]);
		//printf("\n");
		//for(i=0;i<=all;i++)
		//	printf("%d\n",beat[i]);
		printf("Case %d: %lld\n",o,d[all]);
	}
	return 0;
}

回复

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

正在加载回复...