P1941 飞扬小鸟题解

本文详细讲解了如何通过动态规划(DP)解决P1941飞扬小鸟问题,涉及状态转移方程和两种背包优化策略:完全背包处理管子部分,0/1背包用于剩余路径。展示了代码实现和优化技巧,帮助读者理解复杂度降至O(nm^2)的高效算法.
摘要由CSDN通过智能技术生成

P1941 飞扬小鸟题解

DP。

d i , j d_{i, j} di,j到达坐标 i , j i,j i,j 的最小点击量

其中,管子里的坐标的值为 inf ⁡ \inf inf

不难得出,状态转移方程为:

d i , j = min ⁡ ( min ⁡ x k ≤ m ( d i − x k + 1 ) , d i + y ) d_{i, j} = \min(\min_{xk\leq m}(d_{i-xk}+1),d_{i+y}) di,j=min(xkmmin(dixk+1),di+y)

复杂度 O ( n m 2 ) O(nm^2) O(nm2),T 飞。

考虑优化。

可以看出,中间的方程是一个完全背包

代码如下:

// DP. First inf
rep(j, st[i].first + 1, m + st[i].first, 1){
	dp[i][j] = min(dp[i][j - st[i].first] + 1, dp[i - 1][j - st[i].first] + 1);
}
// 考虑超过 m 的情况
rep(j, m + 1, m + st[i].first, 1){
	dp[i][m] = min(dp[i][j], dp[i][m]);
}

剩余的是一个 01 背包

// Then 0/1 DP.
// Falling down.
rep(j, 1, m - st[i].second, 1){
	dp[i][j] = min(dp[i][j], dp[i - 1][j + st[i].second]);
}

管子处理一下就结束了。

细节较多,输出很烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值