zoj 3605

链接

[https://vjudge.net/contest/293343#problem/F]

题意

就是有n碗,有一个宝石,知道开始宝石在那个碗下面
进行M次交换,但知道其中的k次,问你最可能在那个碗

分析

概率dp
状态定义;dp[i][j][r];
当前进行i次知道其中j次宝石在第r碗的方案数
最后就是就是进行m知道K次的方案数最多的那个碗
状态转移:
具体看代码吧

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[60][60][60];
int t,n,m,k,s;
int main(){
	scanf("%d",&t);
	while(t--){
		memset(dp,0,sizeof(dp));
		scanf("%d%d%d%d",&n,&m,&k,&s);
		dp[0][0][s]=1;
		int x,y;
		for(int i=1;i<=m;i++){//当前操作次数  
		scanf("%d%d",&x,&y);
			for(int j=1;j<=n;j++){//当前位置
				for(int r=0;r<=k;r++)//知道的次数 
				{
					if(r!=0){
						if(x==j)
						dp[i][r][j]+=dp[i-1][r-1][y];
						else if(y==j)
						dp[i][r][j]+=dp[i-1][r-1][x];
						else dp[i][r][j]+=dp[i-1][r-1][j];
					}
					dp[i][r][j]+=dp[i-1][r][j];
				}
			}
		}
		int flag; ll ma=-1;
		for(int i=1;i<=n;i++)
			if(dp[m][k][i]>ma){
			   ma=dp[m][k][i];
			   flag=i;	
			}
			printf("%d\n",flag);
	}
	return 0;
}
posted @ 2019-04-12 14:32  ChunhaoMo  阅读(89)  评论(0编辑  收藏  举报