题目貌似是不对外开放的。
题意:
给你一个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