CF round189(div1)C. Kalila and Dimna in the Logging Industry(单调队列斜率优化)

来源:互联网 发布:全民k歌网络好声音 编辑:程序博客网 时间:2024/06/15 10:00

CF round189(div1)C. Kalila and Dimna in the Logging Industry

题意:有n棵树要砍,树的高度a[i],依次递增,且a[1] = 1。每次砍一棵树之后,我们会获得一个电站,在电站i充电时,充满的费用是b[i],且b[n] = 0 ,每砍掉一棵树,我们要给电锯充满电,充电的费用是已获得的电站中,费用最小的那个b[i] 乘以你要去砍的那棵树的高度a[i]。

解题思路:我们发现,既然b[n] = 0 ,那么我们的目的就是用最小的花费去砍掉第n棵树,之后的费用就都是0了。定义dp[i],表示能把i砍掉时,最小的花费是多少,那么dp[i] = dp[j] + b[i] * a[j] , dp[i] , j <= i ,取最小值,这样复杂度为n^2。转换一下思路,dp[i] = dp[j] + b[i] * a[j] 得到 dp[j] = dp[i] - a[i] * b[j],在j的变化过程中,a[i]的值是不变的,因此,我们把这个等式看做一条斜率为-a[i] , 且过(dp[j] , b[j])的直线,那么dp[i]自然就是截距(与y轴的交点),所以我们要求dp[i]最小,就是要找出j变化的过程中,使得其截距最小的那个点。然后就用到单调队列和斜率优化了。这个东西,好复杂,画了好多张纸的直线才弄出来,有大神愿意交流的,请留言。

代码:


原创粉丝点击