zoukankan      html  css  js  c++  java
  • [JLOI2013]卡牌游戏 概率DP

    [JLOI2013]卡牌游戏 概率DP

    题面

    (dfs)复杂度爆炸,考虑DP。发现决策时,我们只用关心当前玩家是从庄家数第几个玩家与当前抽到的牌是啥。于是设计状态(f[i][j])表示有(i)个人时,从庄家数第(j)个人的胜率。又因为此时终态确定(f[1][1]=1)(只有一个人时那个人胜率为100%),所以倒推回去。

    转移时,枚举抽到的牌,算出从庄家数第(t)个会出局,那么下一局庄家就是第(t+1)个,当前局第(j)个就是下一局的第(j-t(t< j))(i-t+j(t> j))个,状态于是就从(i)转移到了(i-1)

    if(t>j) f[i][j]+=f[i-1][i-t+j]/m;
    else if(t<j) f[i][j]+=f[i-1][j-t]/m;
    

    代码:

    #include <cstdio>
    #define MAXN 1001
    using namespace std;
    double f[MAXN][MAXN];
    int a[MAXN];
    int n,m;
    int main(){
    	scanf("%d %d", &n, &m);
    	for(int i=1;i<=m;++i) scanf("%d", &a[i]);
    	f[1][1]=1;
    	for(int i=2;i<=n;++i)
    		for(int j=1;j<=i;++j)
    			for(int k=1;k<=m;++k){
    				int t=((a[k]%i==0)?i:(a[k]%i));
    				if(t>j) f[i][j]+=f[i-1][i-t+j]/m;
    				else if(t<j) f[i][j]+=f[i-1][j-t]/m;
    			}
    	for(int i=1;i<=n;++i) printf("%.2f%% ", f[n][i]*100);
    	return 0;
    }
    
  • 相关阅读:
    大道至简阅读笔记01
    构建之法阅读笔记06
    第二阶段个人工作总结(10)
    学习进度条(十四周)
    第二阶段个人工作总结(9)
    SapringMVC的文件上传下载以及拦截器
    Servlet的请求
    Servlet 的生命周期
    IO流
    set接口
  • 原文地址:https://www.cnblogs.com/santiego/p/11437925.html
Copyright © 2011-2022 走看看