XDOJ 1020 ACMer去刷题吧(基础dp)

题目描述

刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率

输入

第一行输入一个正整数t,(t<=20),表示有t组测试样例。 第二行输入正整数n,k,(1<=n,k<=1000) 第三行输入n个小数,分别为Pi(1<=i<=n,0<=Pi<=1),表示小X做对第i个题目的概率。

输出

输出小X至少做对k道题的概率,并换行(保留4位小数)

样例输入

2
1 1
0.5
3 2
0.3 0.2 0.1

样例输出

0.5000
0.0980

提示

题目大意:

  这题就是说,给你一个每道题做对的概率,然后,让你求出来至少做对k道题的概率是多少.

解题思路:

  其实不难,只要推出来dp[i][j]玩就好了,一开始推了一会,,少了个条件(Q神给窝补上去了)

  状态:dp[i][j]表示的是有i道题,作对j道题的概率。

  初始状态:dp[0][0] = 1,dp[0][1] = 0;

  状态转移方程:dp[i][j] = dp[i-1][j-1]*p[i]+dp[i-1][j]*(1-p[i]);

         dp[i][0] = (1-p[i])*dp[i-1][0]

  最后只要求出来sum+=dp[n][k]+dp[n][k+1]+dp[n][k+2]+...+dp[n][n];

代码:

 1 # include<cstdio>
 2 # include<iostream>
 3
 4 using namespace std;
 5
 6 # define MAX 1234
 7
 8 double p[MAX];
 9 double dp[MAX][MAX];
10 int n,k;
11
12 int main(void)
13 {
14     int t;scanf("%d",&t);
15     while ( t-- )
16     {
17         scanf("%d%d",&n,&k);
18         for ( int i = 1;i <= n;i++ )
19         {
20             scanf("%lf",&p[i]);
21         }
22         dp[0][0] = 1;
23         dp[0][1] = 0;
24         for ( int i = 1;i <= n;i++ )
25         {
26             dp[i][0] = (1-p[i])*dp[i-1][0];
27         }
28         for ( int i = 1;i <= n;i++ )
29         {
30             for ( int j = 1;j <= n;j++ )
31             {
32                 dp[i][j] = (1-p[i])*dp[i-1][j]+p[i]*dp[i-1][j-1];
33             }
34         }
35         double sum = 0;
36         for ( int i = k;i <= n;i++ )
37         {
38             sum+=dp[n][i];
39         }
40        printf("%.4lf\n",sum);
41
42     }
43
44
45     return 0;
46 }
时间: 2024-12-23 15:22:34

XDOJ 1020 ACMer去刷题吧(基础dp)的相关文章

ACMer去刷题吧 XDU1020

1.题目描述:点击打开链接 2.解题思路:本题利用概率dp解决.根据题意描述,我们可以定义d(i,j)表示前i道题做对j道的概率.那么根据全概率公式,可以得到如下递推式: d(i,j)=d(i-1,j)*(1-p[i])+d(i-1,j-1)*p[i](0≤j≤i) 其中p[i]表示第i道题做对的概率.这样,得到所有的d值后,ans=sum{d(i,j)|k≤j≤n} 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #inclu

每日刷题191130 --基础知识篇 二叉搜索树

休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继),INSERT和DELETE等.因此我们使用一颗搜索树既可以作为一个字典又可以作为一个优先队列.且二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比.二叉搜索树有两个很重要的变体,红黑树与B树,这个我们之后有机会再补一篇文章. 顾名思义,一棵二叉搜索树是以一棵二叉树来组织的.如图所示,这样的一

【刷题】【dp】小a和uim之大逃离

地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液. 怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束. 开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收. 魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推. 怪物还说道,最后谁的魔瓶装的魔液多,谁就能活下来.小a和uim感情深厚,情同手足,怎能忍心让小伙伴离自己

【刷题】【dp】help jimmy!

看着复杂,其实理一理之后还好 重要的是 伪代码技巧   #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; int n,mxh; const int N=1e3+3,inf=1<<30; struct node { int l,r,h; bool operator < (const node & o

【刷题】【dp】地精的贸易

完全背包 难点:输出方案 wa点:m的范围在一次dp后,出现变化,导致re #include<cstdio> #include<cstdlib> using namespace std; int m,n; const int N=103,M=1000003; int a[N],b[N]; int f[2][M];//完全背包(压成一维) int pre[2][M]; int ans[N]; int main() { //input scanf("%d%d",&a

国内有哪些好的刷题网站?

http://www.zhihu.com/question/25574458 Luau Lawrence,Data Mining 弱鸡 / [email protected] 温梦强.石一帆.知乎用户 等人赞同 - Welcome To PKU JudgeOnline 北京大学的Online Judge.POJ上面的题目有点老了,但好处是做的人多,经典算法题多,解题报告也多,适合上手.- ZOJ :: Home 浙江大学的Online Judge.ZOJ用的不多,但为数不多的几次体验好像都还可以

基于C#解决OJ刷题之输入输出问题的总结(AKOJ1064-1071A+B问题汇总)

声明:题目部分为akoj题目,代码为本人AC代码. 因为本人学校的oj支持各种环境,非常正常的当中就包括了C#.然暑假在家较为空暇,本着学习C#和复习算法的态度和目的,就又開始折腾起oj了. 题目部分是最基础的A+B系列,来看看C#的输入输出是怎么一回事吧 题目地址:http://183.167.205.82:8081/JudgeOnline/problemlist?volume=1 本文由csdn-jtahstu原创.转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:137375842

比较好的刷题网站推荐

1.Leetcode鼎鼎大名的Leetcode,据不完全统计在上面被刷过的题可以围绕地球三圈.(没说赤道哈,就是这么严谨.)总之,很多国内外的码农在上面刷题.难度从easy到hard都有,而且覆盖面极广.现在还增加了数据库和shell,相匹配的论坛也可以多看看.很锻炼和国外码农沟通的能力,对于以后去混Github也有好处. 特点:各种语言支持很广泛,题型覆盖很广,测试数据集较弱. 2.Codility同样一家著名的国外刷题网站.和Leetcode不同,它是专门帮各大软件公司笔试用的,只是副业提供

ife任务刷题总结(一)-css reset与清除浮动

本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初学者也可以按照他们的任务列表,进行刷题.虽然ife名义上是针对初学者,但是我看了一下任务列表,那些任务还并不是那么简单.所以很适合初学者把任务刷一遍,我觉的,把这些任务都刷完,那么前端算是入门了. 对于代码学习来讲,除了实际的去敲,还有其他更好的学习方法吗?因此我计划按照ife的任务都刷一遍,代码提