程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uestcoj 890 Card Trick(dp+逆推)

uestcoj 890 Card Trick(dp+逆推)

編輯:C++入門知識

uestcoj 890 Card Trick(dp+逆推)


題目鏈接:

啊哈哈,點我點我

思路:從終點向前遞推。

首先p[I]表示從第i個點到終點的概率。則分為兩種情況進行考慮。
【1】已經翻到的點則它必定會到終點,則概率為1.
【2】不知道的點則要進行枚舉。那麼p[i]=sum(p[i+j])/13(2=

為什麼要逆推,因為從前往後走,要用到後面的狀態。

哎,自己的dp好弱啊,一個暑假好像都沒怎麼做。。哎,加油啊!!! 題目:

Card Trick

Time Limit: 2999/999MS (Java/Others) Memory Limit: 65432/65432KB (Java/Others)

I am learning magic tricks to impress my girlfriend Alice. My latest trick is a probabilistic one, i.e. it does work in most cases, but not in every case. To perform the trick, I first shuffle a set of many playing cards and put them all in one line with faces up on the table. Then Alice secretly selects one of the first ten cards (i.e. she chooses x0, a secret number between 1 and 10 inclusive) and skips cards repeatedly as follows: after having selected a card at position xi with a number c(xi) on its face, she will select the card at position xi+1=xi+c(xi). Jack (J), Queen (Q), and King (K) count as 10, Ace (A) counts as 11. You may assume that there are at least ten cards on the table.

Alice stops this procedure as soon as there is no card at position xi+c(xi). I then perform the same procedure from a randomly selected starting position that may be different from the position selected by Alice. It turns out that often, I end up at the same position. Alice is very impressed by this trick.

However, I am more interested in the underlying math. Given my randomly selected starting position and the card faces of every selected card (including my final one), can you compute the probability that Alice chose a starting position ending up on the same final card? You may assume that her starting position is randomly chosen with uniform probability (between 1 and 10 inclusive). I forgot to note the cards that I skipped, so these cards are unknown. You may assume that the card face of every single of the unknown cards is independent of the other card faces and random with uniform probability out of the possible card faces (i.e. 2-10, J, Q, K, and A).

title

Illustration of first sample input: my starting position is 2, so I start selecting that card. Then I keep skipping cards depending on the card's face. This process iterates until there are not enough cards to skip (in this sample: Q). The final Q card is followed by 0 to 9 unknown cards, since Q counts as 10.

Input

For each test case:

  • A line containing two integers n (1≤n≤100) and m (1≤m≤10) where n is the number of selected cards and m is the 1-based position of my first selected card.
  • A line with n tokens that specify the n selected card faces (in order, including the final card). Each card face is given either as an integer x (2≤x≤10) or as a single character (J, Q, K, or A as specified above).

    Output

    For each test case, print one line containing the probability that Alice chooses a starting position that leads to the same final card. Your output should have an absolute error of at most 10?7.

    Sample input and output

    Sample Input Sample Output
    5 2
    2 3 5 3 Q
    1 1
    A
    1 2
    A
    1 10
    A
    6 1
    2 2 2 2 2 2
    7 1
    2 2 2 2 2 2 2
    3 10
    10 J K
    0.4871377757023325348071573
    0.1000000000000000000000000
    0.1000000000000000000000000
    0.1748923357025314239697490
    0.5830713210321767445117468
    0.6279229611115749556280350
    0.3346565827603272001891974

    Source

    Northwestern European Regional Contest 2013

    UESTC Online Judge

    Copyright (C) 2014 Ruins He(@lyhypacm), Jianjin Fan(@pfctgeorge) and Yun Li(@mzry1992). Project home

    Any Problem, Please Report On Issues Page Or Discuss With Us In Mailing List.

    Currently online registered users: 6

    代碼為:

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define eps 1e-9
    #define ll long long
    #define INF 0x3f3f3f3f
    using namespace std;
    const int maxn=2000;
    
    double  p[maxn],ans;
    int n,m;
    
    int main()
    {
        char str[maxn];
        int temp;
        while(~scanf("%d%d",&n,&m))
        {
            memset(p,0,sizeof(p));
            int start=m;
            for(int i=1;i<=n;i++)
            {
                scanf("%s",str);
                p[start]=1;
                if(str[0]<'A'&&str[0]>='2'&&str[0]<='9')  temp=str[0]-'0';
                else if(str[0]=='1'||str[0]=='J'||str[0]=='Q'||str[0]=='K')  temp=10;
                else temp=11;
                start+=temp;
            }
            ans=0;
            for(int i=start;i>=1;i--)
            {
                if(p[i]==0)
                {
                    for(int j=2;j<=11;j++)
                    {
                       temp=(j==10?4:1);
                       p[i]+=temp*p[i+j];
                    }
                    p[i]=p[i]/13;
                }
                if(i<=10)  ans+=p[i];
            }
            printf("%.10f\n",ans/10);
        }
        return 0;
    }



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved