[训练日志] 7月17-21日

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)]

posted on 2017-07-22 23:21  JSZKC  阅读(139)  评论(0编辑  收藏  举报

导航