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]往后枚举即可。