关于F题的疑问

如果dp[x][y]表示的是恰好出现 x 个 2,y 个 3 的期望步数,那么为什么答案不用考虑dp[x + 1][y],dp[x + 2][y]......dp[x + ∞][y] 以及 dp[x][y + 1],dp[x][y + 2]......dp[x][y + ∞] ?答案要求的是第一次出现至少 x 个 2,y 个 3 的期望步数,这两者等价吗?

这些也可以从 dp[x + 1][y - 1],dp[x + 2][y - 1]......dp[x + ∞][y - 1] 以及 dp[x - 1][y + 1],dp[x - 1][y + 2]......dp[x - 1][y + ∞] 对应转移过来呀,也满足题目说的第一次出现就停止呀。

ll inv2 = qsm(2, mod - 2);
for(int i = 1 ; i <= 70 ; i ++) dp[i][0] = dp[0][i] = 3 * i;
for(int i = 1 ; i <= 70 ; i ++)
	for(int j = 1 ; j <= 70 ; j ++) {
		dp[i][j] = (dp[i - 1][j] + dp[i][j - 1] + 3) % mod * inv2 % mod;
	}
cout << dp[x][y] << endl;

@神崎兰子

全部评论
我理解为,当2或者3恰好符合要求,而另一个不符合的时候,即状态dp(a,x)或dp(x,b),可以跳脱出dp思维。如果另一个数还差x个,那么要达到要求,即第一次成为题目所给x的倍数,就只需要简简单单+3*x,这个不难理解。这里最后达到的要求不仅仅可以是(a,b),也可以是(a,b+any_number)或(a+any_number,b)。这样枝剪的操作应该是合乎逻辑的,相当于直接略过了无穷范畴的思考。这就意味着,题目一开始,转移之初就可以直接确定状态(x,b)=(a-x)*3,其中x小于等于a。(a,x),x小于等于b同理。
点赞
送花
回复
分享
发布于 05-14 20:52 浙江

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务