【悬赏关注】斗地主 66 分 WA 34
查看原帖
【悬赏关注】斗地主 66 分 WA 34
560044
wangyi_c楼主2023/3/4 10:37
#include<bits/stdc++.h>
// #define int long long
using namespace std;
int sum[100],T,n,f[60][60][60][60],ans=1e18;
int dp(int a,int b,int c,int d){
//	cout<<a<<" "<<b<<" "<<c<<" "<<d<<"\n";
	if(!a && !b && !c && !d) return 0;
	if(f[a][b][c][d]<0x3f3f3f3f) return f[a][b][c][d];
	int now=a+b+c+d;
	if(a>=2 && sum[0]==2) now--;
	f[a][b][c][d]=min(f[a][b][c][d],now);
	if(d && b>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b-2,c,d-1)+1);
	if(d && a>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a-2,b,c,d-1)+1);
	if(d && b>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b-2,c,d-1)+1);
	if(d && a && c) f[a][b][c][d]=min(f[a][b][c][d],dp(a-1,b+1,c-1,d-1)+1);
	if(d && b && c) f[a][b][c][d]=min(f[a][b][c][d],dp(a+1,b-1,c-1,d-1)+1);
	if(d>=2 && a) f[a][b][c][d]=min(f[a][b][c][d],dp(a-1,b,c+1,d-2)+1);
	if(d && c>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b+2,c-2,d-1)+1);
	if(b && c) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b-1,c-1,d)+1);
	if(a && c) f[a][b][c][d]=min(f[a][b][c][d],dp(a-1,b,c-1,d)+1);
	if(c>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a+1,b,c-2,d)+1);
	if(c>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b+1,c-2,d)+1);
	if(d>=2) f[a][b][c][d]=min(f[a][b][c][d],dp(a,b,c,d-2)+1);
	return f[a][b][c][d];
}
int get(){
	int x[5]={0};
	for(int i=3;i<=15;i++) x[sum[i]]++;
	x[1]+=sum[0];
	return dp(x[1],x[2],x[3],x[4]);
}
void dfs(int step){
	if(step>ans) return ;
	int t=get();
//	system("pause");
	if(step+t<ans) ans=step+t;
	//单顺 
	for(int i=3;i<=10;i++){
		int pos=i;
		while(sum[pos]>=1) pos++;
//		cout<<pos<<"\n";
		for(int j=i+4;j<=pos;j++){
//			cout<<114514<<"\n";
			for(int k=i;k<=j;k++){
				sum[k]--;
			}
			dfs(step+1);
			for(int k=i;k<=j;k++){
				sum[k]++;
			}
		}
	}
	//双顺
	for(int i=3;i<=12;i++){
		int pos=i;
		while(sum[pos]>=2) pos++;
		for(int j=i+2;j<pos;j++){
			for(int k=i;k<=j;k++){
				sum[k]-=2;
			}
			dfs(step+1);
			for(int k=i;k<=j;k++){
				sum[k]+=2;
			}
		}
	}
	//三顺 
	for(int i=3;i<=13;i++){
		int pos=i;
		while(sum[pos]>=3) pos++;
		for(int j=i+1;j<pos;j++){
			for(int k=i;k<=j;k++){
				sum[k]-=3;
			}
			dfs(step+1);
			for(int k=i;k<=j;k++){
				sum[k]+=3;
			}
		}
	}
	return ; 
}
void solve(){
	memset(sum,0,sizeof(sum));
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		if(x==1) x=14;
		if(x==2) x=15;
		sum[x]++;
	} 
//	for(int i=0;i<=15;i++) cout<<sum[i]<<" ";
//	cout<<"\n";
	dfs(0);
//	for(int i=0;i<=15;i++){
//		if(sum[i]) ans++;
//	}
	cout<<ans<<"\n";
	return ;
}
signed main(){
	cin>>T>>n;
	while(T--){
		ans=1e6;
		solve();
	}
	return 0;
} 

帮忙看看吧,孩子快死了

2023/3/4 10:37
加载中...