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(xk≤mmin(di−xk+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]);
}
管子处理一下就结束了。
细节较多,输出很烦。