2017.08.15【NOIP提高组】模拟赛B组

来源:互联网 发布:studded mac 编辑:程序博客网 时间:2024/04/28 11:36

T1:这题暴力枚举,找一个最近的点就好了。


T2:设f[i][j]表示到第i个点上一次跳的距离为j,那么:

f[i][j]=min(f[i+j][j],f[i-j][j-1])+a[i],观察转移方程,我们可以得到循环顺序因为先顺着枚举j,然后到着枚举i,最终的答案就是min(f[n][j])。


总结:有时候dp时我们不知道应怎样确定循环顺序,这时我们可以通过观察状态转移方程来解决。


T3:二分答案,在判断答案是否合法时暴力枚举大包装选的数量,然后计算出小包装选的数量,最后统计答案。


T4:数位dp。

设f[i][j]表示前i个数和为j的最小加号,那么我们枚举一个k,表示从i+1~k这一段合为一个数,设这个数的值为w,那么f[k][j+w]=min(f[k][j+w],f[i][j]+1)。答案为f[n][s]。

但这样会超时,所以我比赛时加了两个优化:

1、当f[i][j]为maxlongint时,直接跳过

2、当w>s时,结束枚举k

但是数据太变态了,专门出一大堆前导0,所以我们要预处理出一个next[]数组,next[i]表示第i个位置往后最近的一个不为0的位置,注意next[n]=n,那么我们的只需从next[i]往后枚举即可。

原创粉丝点击