• 【模拟7.29】大佬(概率期望DP)


    首先根据数据范围,可以判断基本上是n^2的复杂度

    通过分析我们发现每一次都可以从m个数中任意选,既然任意选,那么此时的概率的分母就是不变的,然而题中涉及的是某一段的最大值,所以我们按套路假设

    f[i][j]表示第i天,当前最大值为j的方案数,也可以是概率,

    我们又发现天数是以k为一个单位的,

    那么我们i从1-k枚举即可,

    f[i][j]=f[i-1][j]*j(表示前一道题已经是最大值,这一道题从1-j选择)

    f[i][j]=f[i-1][1---(j-1)]*1(表示当前选j,可以用前缀和维护)

    这里是方案数,因为以k天为单位,所以

    统计出每个f[k][i]*wt[i]*pow(pow(m,k),mod-2)的和

    显然这就是k天的劳累度的期望(也可以理解为每k天的平均花费是这些)

    那么求n天我们只需要看n天中有多少k,答案*(n-k+1)%mod

    (顺便一提:WA95 是因为数据好像有k>n的情况,puts(0)即可,虽然数据范围说没有........)

    以后做期望一定要努力推,其实想懂后真的不难

    其实关于期望的题,也可以用概率或方案数去做,这题就是个假期望......

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<string>
     7 #include<vector>
     8 #define int long long 
     9 #define MAXN 10001
    10 using namespace std;
    11 int f[MAXN][MAXN];
    12 int wt[MAXN];
    13 int n,m,k;
    14 int mod=1000000007;
    15 int pow(int x,int y)
    16 {
    17     int aa=1;
    18     while(y>0)
    19     {
    20          if(y&1)
    21          {
    22             aa=aa*x%mod; 
    23          }
    24          x=x*x%mod;
    25          y>>=1;
    26     } 
    27     return aa%mod;
    28 }
    29 int sum[MAXN][MAXN];
    30 signed main()
    31 {
    32     scanf("%lld%lld%lld",&n,&m,&k);
    33     if(k>n)
    34     {
    35         printf("0
    ");
    36         return 0;
    37     }
    38     for(int i=1;i<=m;++i)
    39     {
    40         scanf("%lld",&wt[i]);
    41     }
    42     for(int i=1;i<=m;++i)
    43     {
    44         f[1][i]=1;
    45         sum[1][i]=sum[1][i-1]+1;
    46     }
    47     for(int i=2;i<=k;++i)
    48     {
    49         for(int j=1;j<=m;++j)
    50         {
    51               f[i][j]=(f[i][j]+f[i-1][j]*j)%mod;
    52               f[i][j]=(f[i][j]+sum[i-1][j-1])%mod;
    53         }
    54         for(int j=1;j<=m;++j)
    55         {
    56               sum[i][j]=(sum[i][j-1]+f[i][j])%mod;
    57         }
    58     }
    59     int ans=0;
    60     for(int i=1;i<=m;++i)
    61     {
    62          ans=(ans+f[k][i]*wt[i]%mod)%mod;
    63     }
    64     printf("%lld
    ",ans*pow(pow(m,k),mod-2)%mod*(n-k+1)%mod);
    65 }
    View Code
  • 相关阅读:
    海康API——获取监控点预览取流URL,获取的rtsp流不能播放
    MySQL——ON DUPLICATE KEY UPDATE添加索引值实现重复插入变更update
    maven——pom.xml的Missing artifact net.sf.json-lib:json-lib:jar:2.4 报错问题(两种有效的解决方案)
    Mysql——navicat如何导出mysql数据表结构
    MySQL——导入导出.sql文件
    仅用U盘就可以去除XP管理员密码
    测试

    navicat 或者workbench 无法连接127.0.0.1(61)的解决方法
    在linux中添加ftp用户,并设置相应的权限
  • 原文地址:https://www.cnblogs.com/Wwb123/p/11263812.html
Copyright © 2020-2023  润新知