Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)

Posted Bestcoderg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)相关的知识,希望对你有一定的参考价值。

题目链接:New Year and Arbitrary Arrangement

题意:  

 有一个ab字符串,初始为空。 Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾添加字母b,当出现≥kab子串时立即停止添加字母,求最后期望的ab子串个数。(子串ab不要求连续) 例子:当k=1aab2abbbabbab时不可能出现的,因为到了bbab就会停止添加字母。

题解: 期望DP

  DP果然是智商的分界线 orz @。@#,这题题意其实我也没看太懂,后来看了别人的博客才勉强写出来。。。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 5e3+9;
 4 const int MOD = 1e9+7;
 5 long long k,pa,pb;
 6 int DP[MAX_N][MAX_N];
 7 long long quick_mod(long long x,int p)
 8 {
 9     long long ans = 1;
10     long long base = x;
11     while(p)
12     {
13         if(p&1) ans = ans*base %MOD;
14         p>>=1;
15         base = (base*base)%MOD;
16     }
17     return ans;
18 }
19 long long inv(long long x)
20 {
21     return quick_mod(x,MOD-2);
22 }
23 long long make_DP(long long i,long long j)
24 {
25     if(i+j>=k)
26         return (i+j+pa*inv(pb)%MOD)%MOD;
27     if(DP[i][j] != -1)
28         return DP[i][j];
29     return DP[i][j] = ((pa*make_DP(i+1,j)%MOD) + (pb*make_DP(i,i+j)%MOD))*inv(pa+pb) %MOD;
30 }
31 int main()
32 {
33     while(cin>>k>>pa>>pb)
34     {
35         memset(DP,-1,sizeof(DP));
36         //cout<<"......"<<DP[2][0]<<endl;
37         cout<<make_DP(1,0)<<endl;
38     }
39     return 0;
40 }

 

  

 

以上是关于Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)的主要内容,如果未能解决你的问题,请参考以下文章

CF 908 D New Year and Arbitrary Arrangement —— 期望DP

Codeforces 908 F. New Year and Rainbow Roads(思维)

Codeforces 908 F. New Year and Rainbow Roads(思维)

解题笔记-CodeForces-908C New Year and Curling

Codeforces908G. New Year and Original Order

Codeforces 611D.New Year and Ancient Prophecy (dp + lcp)