【题解】AT2022 [ARC059D] Unhappy Hacking
更好的阅读体验
Sol
考虑 dp。
设
考虑如何转移。
分以下两种情况进行讨论。
- 敲了退格。那么
dp_{i,j} 可以由dp_{i-1,j+1} 转移。由于我们不关心第j+1 位的字符是0 还是1 ,所以dp_{i,j}=dp_{i,j}+2 \times dp_{i-1,j+1} 。 - 敲了
0 或1 。那么dp_{i,j} 可以从dp_{i-1,j-1} 转移而来。但要注意,此处j-1 需\geq 0 。
边界
Code
cin>>n>>st;
dp[0][0]=1;
for (int i=1;i<=n;i++)
for (int j=0;j<=i;j++)
dp[i][j]=(dp[i-1][max(j-1,0)]+dp[i-1][j+1]*2%mod)%mod;
cout<<dp[n][st.size()]<<endl;