1. 程式人生 > >[訓練日誌] 7月17-21日

[訓練日誌] 7月17-21日

給定 超過 最小花費 位置 ont 如果 app 調整 逆序對數

codeforces 351C
[構造一個n*m的括號序列,每個位置根據%n的情況(和)分別有花費,求最小費用]
[考慮一般dp。有結論狀態不會超過n。所以我們以n位為一塊,用f[i][k][j]表示目前i位,前綴和最小為k,當前和為j的最小費用,預處理出從狀態轉移矩陣T。然後用min_plus矩陣加速T^m計算。]
[狀態不超過2n的證明:在剛到達2n的前一刻的前綴和一定>n,所以可以將之後和為負的塊往前調整,使得狀態不超過2n]
[此題也可考慮倍增, F[k][i][j]表示2^k * n個括號形成[‘]‘ * i + ‘(‘ * j)的最小代價。最後將m的二進制1位的答案合並。]
[有規律,狀態又多得時候大膽猜想狀態是有範圍的。可以將狀態放寬至2*n。]

codeforces 258D
[給一個排列,以及m個數對。對於每個數對有1/2的概率交換兩個位置的數,求最終排列的逆序對數]
[令f[i][j]表示位置i得數>位置j的數。對於數對x,y f[x][y]=f[y][x],其他f[i][x]=f[i][y]=(f[i][x]+f[i][y])/2]
[如果考慮數i個數j之間的關系,會非常難處理,因為他們的位置經常變化。而考慮i和j位置,本身不變化。不變化比變化好處理,這其中富含某種哲理。]

codeforces 279D
[註意到變量中出現的數只能是ai,於是我們可以用狀態壓縮dp]
[因為最後一位一定出現,所以可以不記錄那一位節省空間和時間]

codeforces 126D
[給定n求其斐波拉契數的拆分方案]
[將其貪心地表示為盡可能大的斐波拉契數。可以證明任何一個數一定能被這樣表示出來。然後得到一個01序列,001可以變成110。於是我們從低位的1開始做dp。Dp[i][1]表示這個1保留,dp[i][0]表示這個1拆分。如果拆分會發現這個位置又變成了0,因此對於dp[i+1][0]的轉移會有影響]
[如果從高位往低位考慮會發現容易沖突,不利於思考。]

codeforces 18E
[給n*m的網格重新染色,要求相鄰顏色不一樣且每行最多只能有兩種顏色]
[只能交叉染色。F[i][a][b]表示第i層為止按abab染色的最小花費,轉移是從f[i-1][x][y](x!=a&&y!=b)記錄四個方向的前綴和即可]

NEERC16 Gym101190F
[有一疊牌,每次等概率取若幹張,如果最上面為反面就把抽的牌都反過來,求最後反面向上的牌的期望]
[f[i]表示從底往上取完i張牌的期望。等概率的從i+1至n轉移來。f[j]+(i到j+1的正面或者反面的數量,由第i張的正反面決定) ]

HDU 4976
[你每回合可以使得一個小兵減一滴血,如果死了就得一分。你的回合後所有小兵會減一滴血。求最大得分]
[先計數。對於c[i]=0的位置,對應之後第一個>=2的位置,代價是位置差。於是可以f[i][j]表示到第i個數,剩下j個行動輪。每次可以把行動輪留著,也可以的一分(c[i]>0),或者花若幹代價得一分(c[i]=0)]

[訓練日誌] 7月17-21日