JZ模擬賽 8.18
A組:
T1:
string
Solution:
註意到,只有26個字符。用一個線段樹,維護區間a~z的個數。
每次操作,求出總共的a個數,b個數。。。。z個數。
26次區間修改即可。把前k1個變成a,k1+1到k1+k2個變成b.....
T3:
number
直接數位dp。但是(3)條件還要記錄出現了哪些數字。很麻煩。
n<=20,直接bool記錄這個位置的數有沒有出現過,2^20肯定不行。
如果記錄0~9每一個數出現次數,以出現次數最多的數的個數為進制數呢?顯然,很多狀態都是沒有用的。
還是會被卡到10^10更慘。
zyz:變進制法,1~9開一個桶,有多少個數,就是幾進制。那麽一個狀態S就代表:k0+ k1*num0+k2*num0*num1+...k9*(num0*...*num8)
ki表示,i這個數在狀態中出現的次數。numi表示,原來n中,i出現的次數。
轉移,提取i這一位,S%∏(num0~i)/∏(num0~i-1) (類似一般10進制的取法)
如果能多取,i多取了一個,轉移到S+i*∏(num0~i-1)
變進制法不錯的講解:NKOJ1633 神仙開山【變進制數狀壓DP】
這樣,很多多余的狀態就都壓進去了。總共不到2000個狀態。
我的做法:暴力找到所有可能的情況,暴力n^2判斷能否相互轉移。給每個情況開一個vector啥的。轉移直接訪問vector
反正2000的情況,也能過,就是不優美。
B組:
T1:
rectangle:顯然k個點必定擺成以下兩種情況可能最優:
XXX...XXX
XXX...XXX
.
.
.
XXX...XXX
X..X
XXX...XXXX
XXX...XXX.
. .
. .
. .
XXX...XXX
所以只要枚舉一行的個數(或者一列的個數)。
假設第一種情況除了最後一行每行都是i個,那麽矩形的個數就是C(k/i,2)*C(i,2)+C(k%i,2)*k/i,第二種情況同理。
(來自題解)
JZ模擬賽 8.18