CodeForces - 372CWatching Fireworks is Fun+DP+单调队列优化
【題目描述】
CodeForces - 372CWatching Fireworks is Fun
題目的大概意思就是在一個編號為1…n的街道上現在按照時間順序放煙花,每個煙花獲得的幸福感為b?abs(a?x)b-abs(a-x)b?abs(a?x),x為觀看煙花的位置,為了提升我們的幸福感,我們可能會移動,每個時間單位可以移動d長度,現在問我們如果可以從任何一個地點開始觀看煙花,那么最后幸福感最大是多少
【題目分析】
連我這樣不太會DP的人都能看出來這是一個DP,按照放煙花的順序dp[i][j]=max(dp[i?1][k])+b?abs(a[i]?x)dp[i][j]=max ( dp[i-1][k] )+b-abs(a[i]-x)dp[i][j]=max(dp[i?1][k])+b?abs(a[i]?x),其中k為所有可以到達j位置的點,即i?t?d<=k<=i+t?di-t*d<=k<=i+t*di?t?d<=k<=i+t?d,t是距離上次放煙花的時間差
可是這樣做的話就需要對每一個煙花都遍歷一個很大的區間,應該會超時,所以我們需要進行優化。
我們對于每個煙花,我們都 用一個隊列從前往后計算每個位置,隊列中保存的是能到達當前位置的所有區域中幸福感最大的(按照從前往后的順序),如果后面某個位置的幸福感比前面的大,就會將前面的彈出,再將后面的放進去,因為對于再往后的位置來講,后面這個幸福感更大的位置更有用(前面的能到的后面的一定能到,后面能到的前面的不一定能到,而且前面的值還沒有后面的大,所以就不用考慮他了,這也算是一種貪心吧)
可能這樣說有點繞,可以先看代碼,注意理解雙重循環的部分,再回來看就應該很好理解了。
為了優化空間,我們用一個二維的數組滾動的保存數據,s0保存的是還沒有放這個煙花的幸福感,s1保存的是放了煙花后的幸福感,對于下一個煙花,將s0和s1調換就可以了,最后s0保存的就是最后的結果,查找最大值就可以了。
【AC代碼】
【參考博客】
https://www.cnblogs.com/yehs/p/11331813.html
總結
以上是生活随笔為你收集整理的CodeForces - 372CWatching Fireworks is Fun+DP+单调队列优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地可以现场购票吗
- 下一篇: Currency Exchange——最