P1896互不侵犯(状压)

dp前先将所有满足条件的状态一一求出来,节省时空间

三维数组f[i][j][k]存第i行状态为k,目前共j个将军

行与行之间状态可以通过左右移匹配来查看是否符合条件

P4187[USACO18JAN]Stamp Painting G

思维线性dp

要用前缀和数组辅助递推

先把所有的颜色排列个数求出来(m^n)

再减去不符合条件的个数

不符合条件的即为没有任何一个连续k个相同颜色的排列

前k-1个数字不受影响

当数组滚动到i时且i>k,至多有j~i这一段k-1个有相同颜色,i不能和j-1相同颜色,所以i只有m-1种可能

所以用前缀和数组pre[i-1]-pre[i-k],(j~i-1)的和乘(m-1)得解


P3205 [HNOI2010]合唱队(区间dp)

常规方式,从小范围到大范围

f[i][j][0]表示从最后一次加左边的可能性,f[i][j][1]表示从最后一次加右边的可能性

f[i][j][0/1]从f[i][j-1][1/0]和f[i+1][j][0/1]变化过来


P1792 [国家集训队]种树

反悔贪心(dp思想)

优先队列处理输入的数

从大到小取,每取一个旁边的数标记不能拿。

在录入(左边点权+右边点权−当前点权)的一个id相同,值不同的新数,防止取两边比取该点更优

再用链表维护