CodeForces - 1332D Walk on Matrix(构造)
題目鏈接:點擊查看
題目大意:給出一個錯誤的dp程序,目的是為了求從點 ( 1 , 1 ) 到點 ( n , m ) 只能向下移動或向右移動,找出一條路徑,使得 與運算 的結果最大,給出一個 k ,構造出正確答案與錯誤dp答案相差恰好為 k 時的一個矩陣
題目分析:首先要明白為什么題目給出的dp是錯誤的,乍一看其實沒什么錯誤,但是仔細想一下,題目維護的dp是局部最大值,而對于位運算來說,局部最大值不一定能推出全局最大值的,舉個很簡單的例子,如果同時要和 3 進行 與運算 ,4 & 3 = 0,但 3 & 3 = 3,這樣看來顯然題目給出的dp無法求出全局最大值
到這里如果直接構造的話實際上難度是非常大的,但這個題目很良心的給出了樣例二,我們只需要對于樣例二稍微分析一下就能提取出構造的核心
樣例二的 k 為 1 ,給出的答案為:
3 4
7 3 3 1
4 8 3 6
7 7 7 3
而dp矩陣為:
7 3 3 1
4 0 3 2
4 4 4 2
提示中也說了,最終答案應該是 3 ,而不是程序給出的 2 ,問題就出在了第 ( 3 , 3 ) 這一格上,本來應該將答案 3 一直下傳的,但是到了第 ( 3 , 3 ) 這里,被一個較大的數給沖掉了,使得 3 & 4 = 0 ,故最終答案只能是 2 & 3 = 2 了
有了上面樣例的提示,我們就知道了,應該在 ( 1 , 1 ) 處兵分兩路,一路維護全局最大值,一路維護局部最大值,最后在 ( n , m ) 前一格匯合,最后在 ( n , m ) 這一格使得全局最大值與 a[ n ][ m ] 運算后的答案為 0 ,而實際最大值為 k 即可
最后放一下官方題解的構造方案吧:
這個矩陣從 ( 1 , 1 ) 到 ( 2 , 2 ) 只有兩條路,( 1 , 1 ) -> ( 1 , 2 ) -> ( 2 ,?2 ) 維護的是 2^17,另一條路維護的是 k ,顯然 dp[ 2 ][ 2 ] 的值應該是 2^17 ,最后與 k 異或一下,會發現錯誤的dp的答案為 0 ,而實際上的答案為 k
非常巧妙的一道題
代碼:
?
?
總結
以上是生活随笔為你收集整理的CodeForces - 1332D Walk on Matrix(构造)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1328F M
- 下一篇: CodeForces - 1332B C