zoukankan      html  css  js  c++  java
  • 【模拟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
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/Wwb123/p/11263812.html
Copyright © 2011-2022 走看看