LightOj_1364 Expected Cards
题意:
一副牌, 每个花色13张牌,加上大小王,共54张。
遇到大小王可以代替其中某种花色。
给定C, D, H, S。
每次抽一张牌, 问抽到C张梅花, D张方块, H张红桃, S张黑桃所需要的最小次数的期望。
思路:
用dp[c][d][h][s][staues]表示当前有c张梅花,d张方块,h张红桃,s张黑桃,大小王的状态为staues时, 达到目标所需要的期望。
staues 用余三法进行状压, 因为大小王有两张, 变成某种花色的牌的数目就可能是0,1,2。
四种花色, 也就是2 * 1 + 2 * 3 + 2 * 9 + 2 * 27 = 80种状态。
再分情况考虑, 用dfs进行求解。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 16
#define MAXM 82
#define dd cout<<"debug"<<endl
#define p(x) printf("%d\n", x)
#define pd(x) printf("%.7lf\n", x)
#define k(x) printf("Case %d: ", ++x)
#define s(x) scanf("%d", &x)
#define sd(x) scanf("%lf", &x)
#define mes(x, d) memset(x, d, sizeof(x))
#define do(i, x) for(i = 0; i < x; i ++)
int C, D, H, S;
double dp[MAXN][MAXN][MAXN][MAXN][MAXM];
void init()
{
int i, j, k, m, l;
do(i, MAXN)
do(j, MAXN)
do(k, MAXN)
do(m, MAXN)
do(l, MAXM)
dp[i][j][k][m][l] = -1.0;
}
bool is_ok(int c, int d, int h, int s, int j)
{
int bit[] = {, , , };
int cnt = ;
while(j)
{
bit[cnt ++] = j % ;
j /= ;
}
c += bit[];
d += bit[];
h += bit[];
s += bit[];
if(c >= C && d >= D && h >= H && s >= S)
return true;
return false;
}
double dfs(int c, int d, int h, int s, int j)
{
double &res = dp[c][d][h][s][j];
if(res != -1.0)
return res;
if(is_ok(c, d, h, s, j))
return res = 0.0;
res = 0.0;
int bit[] = {, , , };
int num = ;
int jj = j;
for(int i = ; i < ; i ++)
{
bit[i] = j % ;
j /= ;
num += bit[i];
}
int sum = - (c + d + h + s + num);
if(c < && sum)
{
double p = ( - c) * 1.0 / sum;
res += (dfs(c + , d, h, s, jj) + ) * p;
}
if(d < && sum)
{
double p = ( - d) * 1.0 / sum;
res += (dfs(c, d + , h, s, jj) + ) * p;
}
if(h < && sum)
{
double p = ( - h) * 1.0 / sum;
res += (dfs(c, d, h + , s, jj) + ) * p;
}
if(s < && sum)
{
double p = ( - s) * 1.0 / sum;
res += (dfs(c, d, h, s + , jj) + ) * p;
}
if(num < && sum)
{
double p = ( - num) * 1.0 / sum;
int cnt = bit[] + + bit[] * + bit[] * + bit[] * ;
double temp = dfs(c, d, h, s, cnt); cnt = bit[] + (bit[] + ) * + bit[] * + bit[] * ;
temp = min(temp, dfs(c, d, h, s, cnt)); cnt = bit[] + bit[] * + (bit[] + ) * + bit[] * ;
temp = min(temp, dfs(c, d, h, s, cnt)); cnt = bit[] + bit[] * + bit[] * + (bit[] + ) * ;
temp = min(temp, dfs(c, d, h, s, cnt)); res += (temp + 1.0) * p;
}
return res;
} int main()
{
int T;
int kcase = ;
scanf("%d", &T);
while(T --)
{
scanf("%d %d %d %d", &C, &D, &H, &S);
int x = ;
init();
x = (C > ? C - : ) + (D > ? D - : ) + (H > ? H - : ) + (S > ? S - : );
if(x > )
printf("Case %d: -1\n", ++ kcase);
else
{
double ans = dfs(, , , , );
printf("Case %d: %.7lf\n", ++ kcase, ans);
}
}
return ;
}
LightOj_1364 Expected Cards的更多相关文章
- Light OJ 1364 Expected Cards (期望dp,好题)
题目自己看吧,不想赘述. 参考链接:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/02/2842389.html #include &l ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- Throwing cards away I
Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top a ...
- UVa 10935 - Throwing cards away I (队列问题)
原题 Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the to ...
- uva 10935 throwing cards away <queue>
Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n ...
- UVa---------10935(Throwing cards away I)
题目: Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 ...
- Throwing cards away I uva1594
Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the t ...
随机推荐
- careercup-排序和查找 11.2
11.2 编写一个方法,对字符串数组进行排序,将所有变位词1排在相邻的位置. 类似leetcode:Anagrams 解法: 变位词:由变换某个词或短语的字母顺序构成的新的词或短语.例如,“trian ...
- 通过ftp模拟网盘
package com.xiaomo.ftp.down_upload; import java.io.IOException; import java.util.ArrayList; import j ...
- <BEA-141281> <unable to get file lock, will retry ...> --reference
I ran into this error the first time I restarted Weblogic on one of my installs, the only reference ...
- 嵌入式Linux-GNU Make 使用手册(中译版)
GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...
- [置顶] Datalist嵌套datalist,页面传值,加密,数据绑定
<asp:DataList ID="dlMajor" runat="server" CssClass="dllist" OnItemD ...
- Excel操作之 导出生成多个sheet页面
首先需要下载一个NPOI.dll 下载地址:http://download.csdn.net/detail/president810/9503038 using System; using Syste ...
- XML序列化/反序列化数据库形式保存和读取。
直接上码: 首先创建class1类 public class Class1 { public string name { get; set; } public int age { get; set; ...
- Repeater事件OnItemCommand取得行内控件
记录一下,主要是这句:TextBox txtNum = e.Item.FindControl("txtNum") as TextBox; Repeater真是太强了,太灵活.除了R ...
- 20151213Jquery学习笔记--插件
插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编 写出来的程序.目前 jQuery 插件已超过几千种,由来自世界各地的开发者共同编写.验证 和完 ...
- hdoj1325 Is It A Tree?
Is It A Tree?题目链接 题意: 多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志.当输入-1,-1时测试结束. 从 ...