码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-03 22:03:03      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:details   cin   bsp   pos   lib   连续   can   一个   art   

题目链接: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)

标签:details   cin   bsp   pos   lib   连续   can   一个   art   

原文地址:https://www.cnblogs.com/doggod/p/8410651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!