玻璃走廊题解
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
2. 玻璃走廊
题目ID:22964必做题文件操作100分
时间限制: 2000ms
空间限制: 1024000kB
输入文件名: chain.in
输出文件名: chain.out
题目背景
不知多久后,汤圆发现周遭的事物会根据它的所思所想发生变化。它可以按照自己所想,去改变这个世界。
题目描述
汤圆创建出了一个 n+1n+1 段的走廊,这些段依次编号为 0,1,⋯ ,n0,1,⋯,n。这扇走廊里有 nn 扇门,第 ii 扇门连接走廊的第 ii 段与第 i+1i+1 段。初始有的门是关闭的,有的门是打开的,这个状态由一个长为 nn 的 01 串 ss 给出:si=1si=1 表示第 ii 扇门关闭,si=0si=0 表示第 ii 扇门打开。
汤圆最开始在走廊的第 00 段,现在它要走到第 nn 段。汤圆可以任意通过打开的门,并且移动不会耗费任何代价。
汤圆可以不断进行如下操作:
- 任意时刻,汤圆可以选定一扇关闭的门,然后尝试用意念将其打开。这步操作后,这扇门的状态会从关闭变为打开。
- 由于世界运行的规律,在执行完这步操作后,会有一扇等概率随机的开着的门被关上。注意这扇门可能是汤圆刚打开的门。
求最优策略下,汤圆到达第 nn 扇门最少期望执行多少次开门操作,对 109+7109+7 取模。这里最优策略定义为时刻最小化开门次数的期望。
输入格式
从文件 chain.in 中读入数据。
第一行一个正整数 nn,表示走廊的长度。
第二行一个长为 nn 的 01 串 ss,表示门初始的开关情况。
输出格式
输出到文件 chain.out 中。
输出一行一个整数,表示汤圆到达第 nn 段走廊所需要的期望开门次数,对 109+7109+7取模。
样例
Input 1
2 10
Output 1
4
Input 2
4 1100
Output 2
937500012
Input 3
10 1010011010
Output 3
881510620
数据范围
对于第 1∼41∼4 组数据,n≤15n≤15。
对于第 55 组数据,保证 ss 中 1 形成一段后缀。
对于第 6∼76∼7 组数据,保证 ss 中最多有一个 1。
对于第 8∼108∼10 组数据,保证 ss 中最多有两个 1。
对于第 11∼1511∼15 组数据,n≤300n≤300。
对于第 16∼2016∼20 组数据,无特殊限制。
对于所有数据,保证 1≤n≤30001≤n≤3000,保证 ss 中至少有一个 0。
附件
思路
期望DP。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,f[3005][3005],wd[3005][3005],d[3005],qs=0,mod=1e9+7,t1=0,t2=0,t3=0,t=0;
char s[3005];
long long pow2(long long a1,long long b1,long long m1){
long long kk1=1;
while(b1>=1){
if(b1%2==1){
kk1*=a1;
}
b1/=2;
a1*=a1;
kk1%=m1;
a1%=m1;
}
return kk1;
}
int main(){
freopen("chain.in","r",stdin);
freopen("chain.out","w",stdout);
cin>>n;
for(int i=0;i<=n-1;i++){
cin>>s[i];
if(s[i]=='0'){
qs++;
}
}
//cout<<(qs+1)*pow2(qs,mod-2,mod)%mod<<endl;
for(int i=n-1;i>=0;i--){
d[i]=d[i+1];
if(s[i]=='0'){
d[i]++;
}
}
//d[0]=d[1];
f[0][qs]=0;
for(int i=n-1;i>=0;i--){
for(int j=max(0ll,qs-i);j<=d[i]&&(j<=qs-1||i==0);j++){
t3=pow2(qs,mod-2,mod);
t1=(f[i+1][j]+(qs+1)*t3)%mod;
//if(j!=0){
t2=(f[i+1][j-1]+(qs+1)*t3)%mod;
//}
t=(d[i]-j)*pow2(d[i],mod-2,mod)%mod;
if(s[i]=='1'){
f[i][j]=(f[i][j]+(qs-j)*t3%mod*t1%mod)%mod;
if(j){
f[i][j]=(f[i][j]+j*t3%mod*t2%mod)%mod;
}
}
else{
f[i][j]=(f[i][j]+(qs-j)*t3%mod*t1%mod*t)%mod;
if(j){
f[i][j]=(f[i][j]+j*t3%mod*t2%mod*t)%mod;
}
//if(j!=0){
f[i][j]=(f[i][j]+(mod+1-t)*f[i+1][j-1])%mod;
//}
}
}
}
cout<<f[0][qs]%mod<<endl;
return 0;
}

浙公网安备 33010602011771号