BUPT 2016校赛-Binary Strings 概率DP

题目貌似是不对外开放的。

题意:

  给你一个01串,其中会有未知个数的? 可以为0或1,问这个01串的任意一个子串能整除3的个数的期望。

忽略前导0。

输入

  一个 T 包含T组数据(1≤T≤50)

接下来T组中,一个N (1≤N≤100000)

  N长度的01?串

输出

  保留2位小数。

题解

  dp[i][j] (j=0,1,2)表示第i位余数为j的个数

  出现一个0,就直接给sum+1,出现?sum+0.5

  剩下的就是dp[i][0]的个数。

#include<cstdio>
#include<cstring>
using namespace std;

double dp[100100][3];
char s[100100];

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int m;
        double sum=0;
        scanf("%d %s",&m,s+1);

        dp[0][0]=dp[0][1]=dp[0][2]=0;

        for(int i=1;i<=m;i++)
        {
            if(s[i]==‘0‘)
            {
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][2];
                dp[i][2]=dp[i-1][1];
                sum=sum+1;
            }
            if(s[i]==‘1‘)
            {
                dp[i][0]=dp[i-1][1];
                dp[i][1]=dp[i-1][0]+1;
                dp[i][2]=dp[i-1][2];
            }
            if(s[i]==‘?‘)              // 直接存0或1的期望值
            {
                dp[i][0]=(dp[i-1][0]+dp[i-1][1])/2;
                dp[i][1]=(dp[i-1][2]+dp[i-1][0]+1)/2;
                dp[i][2]=(dp[i-1][1]+dp[i-1][2])/2;
                sum=sum+0.5;
            }
            sum=sum+dp[i][0];
        }
        printf("%.2lf\n",sum);
    }
}
时间: 2024-10-13 05:23:10

BUPT 2016校赛-Binary Strings 概率DP的相关文章

篮球校赛(状压dp)

篮球校赛 题目描述 JWJU注重培养学生的“唱,跳,rap,篮球”能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台.校赛冠军的奖励是看wls女装一次,为了这个目标,大家都努力训练,希望自己能看到wls女装. 教练mymy手下有 nn 名队员,现在他要挑选 55 人组成一个篮球队来参赛.众所周知,一个篮球队伍有五个不同的位置(控球后卫,得分后卫,小前锋,大前锋,中锋),现在教练mymy给出每名队员在每个位置的能力. 注:如果一个队员作为控球后卫出战,则他只能发挥他的控球后卫

2014牡丹江区域赛D(概率DP)ZOJ3822

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4 这个题目自然会考虑到去讨论最长或者最短的板子. 笔上大概模拟一下的话,就会知道,假设最长的板子是r,0和n+1位置上都是高度为0的板子,那么对于[0, r-1]中的最长板子rr,rr到r这一短应该都是被深度为a[rr]的水覆盖.同样的[0, rr-1]中的最长板子rrr,rrr到rr这一段应该是被a[rrr]覆盖,以此类推可以搞定r的前面一段,同理搞定后一段. 关于最值这一块,

广工2016校赛决赛

重现补的题目. Problem A: Krito的讨伐 思路:不要求一次性杀光一个节点里面的所有怪物. 所以我们可以用一个优先队列.优先去杀那些我们当前可以挑战的,然后注意下处理一个房间可能有多个怪物或者无怪物.当我们杀完第x个房间的怪物时候,那么就把x的下一层的怪物加入队列,如果x的下一层出现了空房间[即房间不存在怪物],那么再把该房间当做新的x,继续加入新x的下一层直到出现了有怪物的房间位置. #define _CRT_SECURE_NO_DEPRECATE #include<iostrea

zoj3822||牡丹江现场赛D题 概率dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with

ACM学习历程—广东工业大学2016校赛决赛-网络赛F 我是好人4(数论)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=5 这个题目一看就是一道数论题,应该考虑使用容斥原理,这里对lcm进行容斥. 不过直接上去是T,考虑到序列中同时存在i和ki的话,其实只需要考虑i,所以先对序列中为倍数的对进行处理. 这里的容斥用了hqw的写法. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #includ

广州工业大学2016校赛 F 我是好人4 dfs+容斥

Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍数 最后友情提供解题代码(我真是太好人了) void solve(int p[], int n) { int ans = 0; for (int i = 1; i <= 1e9; i++) { int fl = 0; for (int j = 0; j < n; j++) { if (i % p[

ACM学习历程—广东工业大学2016校赛决赛-网络赛D 二叉树的中序遍历(数据结构)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=3 这算是一个胡搞类型的题目.当然肯定是有其数据结构支撑的. 唯一的限制就是不能出现连续的两个’#’. 因为如果我从左到右构造这棵树,那么假设我构造到第i个, 如果i+1是数字,那么把前i个构成的子树作为i+1的左儿子即可. 如果i+1是’#’,那么把’#’当成i的右儿子即可. 所以只要没有两个连续的’#’,自然能通过上面的方法构造. 但是如果出现两个连续的’#’,自然前一个’#’

ACM学习历程—广东工业大学2016校赛决赛-网络赛C wintermelon的魔界寻路之旅(最短路 &amp;&amp; 递推)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=2 题目由于要找对称的路径,那么狠明显可以把右下角的每一块加到左上角对应的每一块上.然后就变成从左上角走到对角线的最短路径的个数. 先跑一遍最短路径得到p(i, j)从起点到(i, j)的最短路径. 然后就是找最短路径的个数.显然cnt(i, j)是它周围点能通过最短路径到它的cnt的和.这一处可以使用记忆化搜索来完成. 代码: #include <iostream> #