• 紫书 例题 10-12 UVa 1637(概率计算)


    以9元组来代表当前状态,每一元是每一堆剩下的牌数

    枚举当前状态所有可以拿掉牌的情况,然后递归下去求

    概率,当牌拿完的时候概率为1

    那么这里的实现非常的秀,用到了vector来代表9元组

    然后还用到了map来实现记忆化搜索

    #include<cstdio>
    #include<vector>
    #include<map>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    char card[9][4][3];
    map<vector<int>, double> d; //实现记忆化搜索 
    
    bool read()
    {
    	REP(i, 0, 9)
    		REP(j, 0, 4)
    			if(scanf("%s", card[i][j]) == -1)
    				return false;
    	return true;
    }
    
    double dp(vector<int>& cnt, int c) //c表示总的牌数 
    {
    	if(c == 0) return 1;
    	if(d.count(cnt) != 0) return d[cnt];
    	int tot = 0; double sum = 0;
    	
    	REP(i, 0, 9) if(cnt[i] > 0)
    		REP(j, i + 1, 9) if(cnt[j] > 0)
    			if(card[i][cnt[i] - 1][0] == card[j][cnt[j] - 1][0])
    			{
    				tot++; cnt[i]--; cnt[j]--;
    				sum += dp(cnt, c - 2);
    				cnt[i]++; cnt[j]++;
    			}
    	
    	if(!tot) return d[cnt] = 0;
    	else return d[cnt] = sum / tot;
    }
    
    int main()
    {
    	while(read())
    	{
    		vector<int> cnt(9, 4); //初始化4 4 4 4 4 4 4 4 4 的一个 vector
    		d.clear();
    		printf("%.6lf
    ", dp(cnt, 36));
    	}
    	return 0;
    }

  • 相关阅读:
    iframeUpload
    获取当前文件路径。
    ie6 overflow 失效
    ie8 vml不显示
    json转换
    nodejs for windows
    模块化管理组件(2012/05/09)
    模块化管理组件v0.1
    Firefox和IE之间7个JavaScript的差异
    c输入函数细节
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819507.html
Copyright © 2020-2023  润新知