1. 程式人生 > 其它 >「POI2007」四進位制天平 Quaternary Balance 題解

「POI2007」四進位制天平 Quaternary Balance 題解

「POI2007」四進位制天平 Quaternary Balance 題解

\(n\) 可以到 \(10^{1000}\) ,所以考慮數位 \(dp\)

當然這只是個直覺,具體怎麼做呢?

砝碼的質量都是 \(4\) 的冪,稱出質量為 \(m\) 的物體,可以看成是一個 \(4\) 進位制大整數的逐位確定,放左盤可理解為加法(該位為正),放右盤可理解為減法(該位為負),可以看出左右盤不可能都放。最後用的總砝碼數等於各位數碼的絕對值之和。

由於有負數,出現了前面放多,後面借位的可能,例子:

3  2  3  1
4  -1 0 -3

\(S_{l,r}\)\(n(base 4)\) (n 為原數)中 \([l...r]\)

一段拼接出的數。如果 \(pos\) 這一位多放了 \(1\) ,其實多的是 \(4^{len-pos} - S_{pos+1,len}\),那麼後面為了借回來,就要用 \(4^{len-pos}\),為了平衡回來,後面就得變成 \(4^{len-pos} - S_{pos+1,len}\) 的四進製表示,再每位取相反數了。這等價於把 \(pos + 1 ... len-1\) 位減去 \(3\) ,最後一位減去 \(4\)

那麼借位肯定是連續的一段。提前結束一段也有可能:

3  2  3  1
4  -2 3  1

結束一段後就恢復正常了。

我們再看看多段的情況:

1 *3  1  0 *2  2 *3  2
1  4  -2 -4 2  2  4  -2

不難發現,每段都是獨立的,

那麼可以設計出求最小砝碼數的 \(dp\)\(dp1_{i,j}\) 表示考慮到第 \(i\) 位,這位是否在“一段”中。算好數碼轉移就好了,\(O(len)\) 的。

這題求的是方案數。要求還原方案的 \(dp\) 題寫過吧?其實求方案數也一樣,設一個 \(dp2_{i,j}\) ,算 \(dp2\) 時,只要 \(dp1\) 從這種方式轉移過來是最優的,我們就可以累加。也是 \(O(len)\) 的。

所以這題資料似乎還可以加強...