记忆化求调
查看原帖
记忆化求调
562569
kingho11楼主2024/10/19 14:56

rt,样例的答案是0

#include<bits/stdc++.h>
using namespace std;
int top[10];
char ch[10][10];
int cntwin,cntlose;
double sum,f[5][5][5][5][5][5][5][5][5];
double dfs(int sheng,double gl)
{
//	cout<<sheng<<" "<<gl<<"\n";
	if(f[top[1]][top[2]][top[3]][top[4]][top[5]][top[6]][top[7]][top[8]][top[9]]!=0)
	{
		sum+=f[top[1]][top[2]][top[3]][top[4]][top[5]][top[6]][top[7]][top[8]][top[9]];
		return f[top[1]][top[2]][top[3]][top[4]][top[5]][top[6]][top[7]][top[8]][top[9]];
	}
//	cout<<sheng<<"\n";
//	for(int i=1;i<=9;i++)
//	{
//		cout<<top[i]<<" ";
//	}
//	cout<<"\n";
	if(sheng==0)
	{
		sum+=gl;
		return gl;
	}
	int cntt=0;
	for(int i=1;i<=8;i++)
	{
		for(int j=i+1;j<=9;j++)
		{
			if(ch[i][top[i]]==ch[j][top[j]] && top[i] && top[j])
			{
				cntt++;
			}
		}
	}
	for(int i=1;i<=8;i++)
	{
		for(int j=i+1;j<=9;j++)
		{
			if(ch[i][top[i]]==ch[j][top[j]] && top[i] && top[j])
			{
				top[i]--,top[j]--;
				f[top[1]][top[2]][top[3]][top[4]][top[5]][top[6]][top[7]][top[8]][top[9]]+=dfs(sheng-2,gl/cntt);
				top[i]++,top[j]++;
			}
		}
	}
	return f[top[1]][top[2]][top[3]][top[4]][top[5]][top[6]][top[7]][top[8]][top[9]];
}
int main()
{
//	freopen("double.in","r",stdin);
//	freopen("double.out","w",stdout);
	for(int i=1;i<=9;i++)
	{
		top[i]=4;
		for(int j=1;j<=4;j++)
		{
			char o,p;
			cin>>o>>p;
			ch[i][j]=o;
		}
	}
	cout<<dfs(36,1)<<"\n";
//	for(int i=1;i<=4;i++) for(int ii=1;ii<=4;ii++) for(int iii=1;iii<=4;iii++) for(int j=1;j<=4;j++) for(int jj=1;jj<=4;jj++) for(int jjj=1;jjj<=4;jjj++) for(int k=1;k<=4;k++) for(int kk=1;kk<=4;kk++) for(int kkk=1;kkk<=4;kkk++) cout<<f[i][ii][iii][j][jj][jjj][k][kk][kkk]<<"\n";
//	cout<<cntwin<<" "<<cntlose<<"\n";
//	printf("%.6f",sum);
} __ 
2024/10/19 14:56
加载中...