WA10pts求条
查看原帖
WA10pts求条
772875
RAY091016楼主2025/7/28 19:44

样例三种分数均正确,code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
string s;
int cnt[40];
set<int>pai;
int gsws(){
	int ws[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34},ret=-1e9;
	for(int i=1;i<=13;i++){
		int ans=13,flag=1;
		for(int j=1;j<=13;j++){
			if(j!=i){
				if(cnt[ws[j]]>=1){
					ans*=cnt[ws[j]];
				}
				else{
					flag=0;
				}
				if(pai.count(ws[j])){
					ans*=2;
				}
			}
			else{
				if(cnt[ws[j]]>=2){
					ans*=(cnt[ws[j]]*(cnt[ws[j]]-1)/2);
				}
				else{
					flag=0;
				}
				if(pai.count(ws[j])){
					ans*=4;
				}
			}
		}
		if(flag){
			ret=max(ret,ans);
		}
	}
	return ret;
}
int C(int a,int b){
	if(a<b){
		return 0;
	}
	if(b==0){
		return 1;
	}
	int up=1,down=1;
	for(int i=1;i<=b;i++){
		up*=(a-i+1);
		down*=i;
	}
	return up/down;
}
int qpow(int base,int up){
	int ret=1;
	while(up){
		if(up&1){
			ret*=base;
		}
		base*=base;
		up>>=1;
	}
	return ret;
}
int com(){
	int f[40][10][2][10][10],ans=-1e9;
	memset(f,0,sizeof f);
	f[0][0][0][0][0]=1;
	for(int i=0;i<=8;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							for(int t=1;t<=2;t++){
								if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
									f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
								}
							}
							if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
							if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
								f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=9;i<=10;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=11;i<=17;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							for(int t=1;t<=2;t++){
								if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
									f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
								}
							}
							if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
							if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
								f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=18;i<=19;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=20;i<=26;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							for(int t=1;t<=2;t++){
								if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
									f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
								}
							}
							if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
								f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
							if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
								f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=27;i<=33;i++){
		for(int j=0;j<=4;j++){
			for(int k=0;k<=1;k++){
				for(int c1=0;c1<=4;c1++){
					for(int c2=0;c2<=4;c2++){
						if(f[i][j][k][c1][c2]!=0){
							if(j==4&&k==1){
								ans=max(ans,f[i][j][k][c1][c2]);
							}
							if(j<=3&&cnt[i+1]>=3){
								f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
							}
							if(cnt[i+1]>=2&&k==0){
								f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
							}
							f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
						}
					}
				}
			}
		}
	}
	for(int i=0;i<=4;i++){
		for(int j=0;j<=4;j++){
			ans=max(ans,f[34][4][1][i][j]);
		}
	}
	return ans;
}
int qdz(){
	int f[40][40],ans=-1e9;
	memset(f,0,sizeof f);
	f[0][0]=7;
	for(int i=0;i<=33;i++){
		for(int j=0;j<=7;j++){
			if(f[i][j]!=0){
				if(j==7){
					ans=max(ans,f[i][j]);
				}
				if(cnt[i+1]>=2&&j<=6){
					f[i+1][j+1]=max(f[i+1][j+1],f[i][j]*(cnt[i+1]*(cnt[i+1]-1)/2)*(pai.count(i+1)?4:1));
				}
				f[i+1][j]=max(f[i+1][j],f[i][j]);
			}
		}
	}
	ans=max(ans,f[34][7]);
	return ans;
}
signed main(){
	cin>>t;
	while(t--){
		for(int i=1;i<=34;i++){
			cnt[i]=4;
		}
		pai.clear();
		while(cin>>s){
			if(s=="0"){
				break;
			}
			else{
				if(s.size()==2){
					if(s[1]=='m'){
						cnt[s[0]-'0']--;
					}
					if(s[1]=='p'){
						cnt[s[0]-'0'+9]--;
					}
					if(s[1]=='s'){
						cnt[s[0]-'0'+18]--;
					}		
				}
				else{
					if(s=="E"){
						cnt[28]--;
					}
					if(s=="S"){
						cnt[29]--;
					}
					if(s=="W"){
						cnt[30]--;
					}
					if(s=="N"){
						cnt[31]--;
					}
					if(s=="Z"){
						cnt[32]--;
					}
					if(s=="B"){
						cnt[33]--;
					}
					if(s=="F"){
						cnt[34]--;
					}
				}
			}
		}
		while(cin>>s){
			if(s=="0"){
				break;
			}
			else{
				if(s.size()==2){
					if(s[1]=='m'){
						pai.emplace(s[0]-'0');
					}
					if(s[1]=='p'){
						pai.emplace(s[0]-'0'+9);
					}
					if(s[1]=='s'){
						pai.emplace(s[0]-'0'+18);
					}		
				}
				else{
					if(s=="E"){
						pai.emplace(28);
					}
					if(s=="S"){
						pai.emplace(29);
					}
					if(s=="W"){
						pai.emplace(30);
					}
					if(s=="N"){
						pai.emplace(31);
					}
					if(s=="Z"){
						pai.emplace(32);
					}
					if(s=="B"){
						pai.emplace(33);
					}
					if(s=="F"){
						pai.emplace(34);
					}
				}
			}
		}
		int sc1=gsws(),sc2=com(),sc3=qdz();
		cout<<max(sc1,max(sc2,sc3))<<endl;
	}
	return 0;
}

2025/7/28 19:44
加载中...