zoukankan      html  css  js  c++  java
  • 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 }

      

  • 相关阅读:
    1.8 接口中的静态方法
    1.7 默认方法
    1.6 变量作用域
    汉字转拼音
    1.5 构造器引用
    1.4 方法引用
    循环中冲不掉外部定义的变量
    getBoundingClientRect
    Angular1.0 在Directive中调用Controller的方法
    horizontalDragMaxWidth:0;就没有水平滚动条了
  • 原文地址:https://www.cnblogs.com/doggod/p/8410651.html
Copyright © 2011-2022 走看看