codeforces Name That Tune (概率dp)

题意:

D - Name That Tune

Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d
& %I64u

Submit Status Practice CodeForces
499D

Appoint description: 
System Crawler  (2015-01-05)

Description

It turns out that you are a great fan of rock band AC/PE. Peter learned that and started the following game: he plays the first song of the list of n songs of the group, and you
have to find out the name of the song. After you tell the song name, Peter immediately plays the following song in order, and so on.

The i-th song of AC/PE has its recognizability pi. This means
that if the song has not yet been recognized by you, you listen to it for exactly one more second and with probability of pi percent you recognize
it and tell it‘s name. Otherwise you continue listening it. Note that you can only try to guess it only when it is integer number of seconds after the moment the song starts playing.

In all AC/PE songs the first words of chorus are the same as the title, so when you‘ve heard the first ti seconds of i-th
song and its chorus starts, you immediately guess its name for sure.

For example, in the song Highway To Red the chorus sounds pretty late, but the song has high recognizability. In the song Back In Blue, on the other hand, the words from the title sound close to the beginning of the song, but it‘s hard to name it before
hearing those words. You can name both of these songs during a few more first seconds.

Determine the expected number songs of you will recognize if the game lasts for exactly T seconds (i. e. you can make the last guess on the second T,
after that the game stops).

If all songs are recognized faster than in T seconds, the game stops after the last song is recognized.

Input

The first line of the input contains numbers n and T (1?≤?n?≤?5000, 1?≤?T?≤?5000),
separated by a space. Next n lines contain pairs of numbers pi and ti (0?≤?pi?≤?100, 1?≤?ti?≤?T).
The songs are given in the same order as in Petya‘s list.

Output

Output a single number — the expected number of the number of songs you will recognize in T seconds. Your answer will be considered correct if its absolute or relative error does
not exceed 10?-?6.

Sample Input

Input

2 2
50 2
10 1

Output

1.500000000

Input

2 2
0 2
100 2

Output

1.000000000

Input

3 3
50 3
50 2
25 2

Output

1.687500000

Input

2 2
0 2
0 2

Output

1.000000000

分析:我们可以定义dp[i][j]表示第i首歌在第j秒的时候被猜出来,那么当第i首歌被猜出来的时候,前i-1首歌也被猜出来,状态转移就发生在第i-1层到第i层之间;
PS:最终的期望就等于每层的概率之和,这是因为猜对歌的期望就等于对每首歌都猜对的期望和;
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
double p[5500],dp[5500][5500];
int t[5500],n,T;

double pow( double p,int t )
{
  double ans=1;
  for(int i=1;i<=t;i++)ans*=p;
  return ans;
}

void DP()
{
  dp[0][0]=1.0;
  double ans=0.0;
  for(int i=1;i<=n;i++)
      {
        double f=0.0;
        double tt=pow(  1-p[i], t[i]-1 );
        for(int j=i;j<=T;j++)
         {
           f=f*( 1-p[i] )+dp[i-1][j-1];
           if( j>=t[i] )
           {
             f=f-dp[i-1][j-t[i]]*tt;
             dp[i][j]=f*p[i]+dp[i-1][j-t[i]]*tt;
           }
           else dp[i][j]=f*p[i];
           ans+=dp[i][j];
         }
       }
   printf("%.9lf\n",ans);
}

int main()
{
  while(scanf("%d%d",&n,&T)!=EOF)
  {
     memset(dp,0,sizeof(dp));
     for(int i=1;i<=n;i++)
     {
        scanf("%lf%d",&p[i],&t[i]);
        p[i]/=100;
     }
     DP();
  }
  return 0;
}

				
时间: 2024-10-10 00:02:34

codeforces Name That Tune (概率dp)的相关文章

codeforces 482c 状压+概率DP

题意:给出N个不同的串,长度一样,别人随机选一个串,你要询问他那个串某一个位置是什么字符直到能确定那个串才能停止,问询问次数的期望. 题解:50个串20个位置容易想到状压,把字符串长度状压先考虑能否在某一个状态确定哪些字符串能确定哪些不能确定,需要2^m*m次,然后时间上不能再乘以n不然会爆,想想只要我知道到达某一个猜位置状态的概率dp[i],再知道相对应有哪些字符串可以确定和不可以确定,用f[i]来表示,那么对于不能确定的字符串相当于就要再猜一步,那么加上这个状态的概率就行了,不会再需要乘以n

Codeforces 498B. Name That Tune 概率DP+优化

dp[i][j] 第i首歌在第j分钟听出来..... 一般情况下: dp[i][j]= dp[ i-1] [ j-k ] * p[i] * (1-p[i])^(k-1) 当k==t[i]时,一定可以听出来还要另加上 dp[ i-1] [ j-k ]*(1-p[i])^k 需要维护一段dp[i-1][k]的和,将时间复制度降到O(n^2) B. Name That Tune time limit per test 1 second memory limit per test 256 megabyt

CodeForces 499D. Name That Tune(概率dp)

It turns out that you are a great fan of rock band AC/PE. Peter learned that and started the following game: he plays the first song of the list of n songs of the group, and you have to find out the name of the song. After you tell the song name, Pet

codeforces 1156F Card Bag 概率dp

Card Bag 状态只会从a小转移到a大,随便dp就好了. #include<bits/stdc++.h> using namespace std; const int N = 5000 + 7; const int mod = 998244353; int n, a[N], sum[N], dp[N][N], sum_dp[N]; int inv[N]; int main() { inv[1] = 1; for(int i = 2; i < N; i++) { inv[i] = 1L

Codeforces Div.301D Bad Luck Island(概率dp+记忆化搜索)

一道概率dp问题. 题目链接:http://codeforces.com/contest/540/problem/D 题目大意:一个岛上有r个石头,s个剪子,p个布,他们之间随机挑出两个相遇,如果不是相同物种,就会有一个消失,分别求出最后这座岛上只剩下一个物种的概率. 我们用dp[i][j][k]来存储i个石头,j个剪刀,k个布时,某物种的存活概率,共dp三次,算出三个物种分别的概率. 首先,我们需要把对应想求的物种概率初始化,这里以石头为例,那么对于i从1到r,不难理解dp[i][0][0]=

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

Codeforces 148D Bag of mice (概率dp)

D. Bag of mice time limit per test:2 seconds memory limit per test:256 megabytes The dragon and the princess are arguing about what to do on the New Year's Eve. The dragon suggests flying to the mountains to watch fairies dancing in the moonlight, wh

Codeforces 518D Ilya and Escalator (概率dp)

Ilya and Escalator time limit per test: 2 seconds memory limit per test: 256 megabytes Ilya got tired of sports programming, left university and got a job in the subway. He was given the task to determine the escalator load factor. Let's assume that

codeforces 235B Let&#39;s Play Osu! 概率dp

题意:给定n表示有n个格子,下面每个格子为O的概率是多少.对于一段连续 x 个O的价值就是 x^2 ;求获得的价值的期望是多少. 思路:n^2=n×(n-1)+n,设ai为第i段连续O的长度,∑ai^2 = ∑[ ai+ ai*(ai-1) ] = ∑ ai*(ai-1) + ∑ai = ∑ C(ai, 2)*2 + ∑ai,那么问题可以转 化为求长度大于1的连续段数*2+O的个数的总期望. ∑ai我们可以理解为O的总个数,所以它的期望为∑pi: C(ai, 2)*2我们可以认 为是连续ai个O