/*
题意:
Alice和Bob在玩一个游戏,该游戏需要n个杯子和一个石头,开始时石头被罩在在某个杯子里,
Alice可交换任意两个杯子,经过一系列的交换,由Bob猜石头在哪个杯子里,交换总共m步,但Bob只看到了其中的k步,问Bob猜哪个杯子的可能性最大。
因为顺序是一定的,即选了k步之后,顺序只有一种。
c[n][m]=c[n-1][m-1]+c[n-1][m];
具体编码的时候只考虑到交换的两个杯子而忘记其他杯子在选择时的值也要加上c[n-1][m-1];
*/
# include <stdio.h>
# include <algorithm>
# include <iostream>
# include <string.h>
using namespace std;
long long dp[60][60][60];///i,j,k 前i次操作有效操作k次 东西在j的概率
int main()
{
int t,flag,i,j,k,p,n,m,s,a,b;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d%d%d%d",&n,&m,&k,&s);
memset(dp,0,sizeof(dp));
dp[0][s][0]=1;
for(i=1; i<=m; i++) ///操作数
{
scanf("%d%d",&a,&b);
for(j=1; j<=n; j++) ///在第几个盒子里
{
for(p=0; p<=k; p++) ///有效操作
{
if(p!=0)//换
{
if(j==a)
dp[i][j][p]+=dp[i-1][b][p-1];
else if(j==b)
dp[i][j][p]+=dp[i-1][a][p-1];
else
dp[i][j][p]+=dp[i-1][j][p-1];
}
dp[i][j][p]+=dp[i-1][j][p];
}
}
}
long long maxx=-1;
for(i=1; i<=n; i++)
{
if(dp[m][i][k]>maxx)
{
maxx=dp[m][i][k];
flag=i;
}
}
printf("%d\n",flag);
}
}
return 0;
}
zoj 3605 Find the Marble (概率dp)
最新推荐文章于 2019-03-22 12:00:47 发布