题目链接:New Year and Arbitrary Arrangement
题意:
有一个ab字符串,初始为空。 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾添加字母b,当出现≥k个ab子串时立即停止添加字母,求最后期望的ab子串个数。(子串ab不要求连续) 例子:当k=1,aab含2个ab,bbabbab时不可能出现的,因为到了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 }