DP花园题乱做

发布时间 2023-04-18 22:29:55作者: 闫辛祎C++

CF837D

考虑 $f[i][j][cnt2][cnt5]$ 统计前 $i$ 个数选 $j$ 个,满足有 $cnt2$ 个 $2$ 和 $cnt5$ 个 5 是否成立。

但 $f$ 只存 $0$ 或 $1$,考虑 $f[i][j][cnt5]=cnt2$,即统计前 $i$ 个数选 $j$ 个,满足 $cnt5$ 个 5 有都少个 $2$。

滚动!

$f[i][j][k] = max(f[i][j][k],f[i-1][j-1][k-cnt5[i]]+cnt2[i]);$

P2476

计算每个颜色剩余的个数太la了,所以就统计每个剩余个数有多少颜色!

考虑 $dp[a][b][c][d][e][last]$ 统计剩 $1,2,3,4,5$ 个格子的颜色的种类数时,上一步选择的是剩余 $last$ 个格子的颜色中的一种的方案数。

考虑枚举现在选取的是那个种类,如果上次染色也选取了相同种类就减去。

。记忆化搜索

	if(_1 > 0)res += dp(_1-1,_2,_3,_4,_5,1)*(_1-(last == 2));
	if(_2 > 0)res += dp(_1+1,_2-1,_3,_4,_5,2)*(_2-(last == 3));
	if(_3 > 0)res += dp(_1,_2+1,_3-1,_4,_5,3)*(_3-(last == 4));
	if(_4 > 0)res += dp(_1,_2,_3+1,_4-1,_5,4)*(_4-(last == 5));
	if(_5 > 0)res += dp(_1,_2,_3,_4+1,_5-1,5)*_5;

P4401

$f[i]$ 太难了,所以提升维度

。$f[i][a1][a2][b1][b2]$ 统计第 $i$ 辆配餐车来时,昨天 $1$ 矿井吃 $a1$,$2$ 矿井吃 $b1$,前天 $1$ 矿井吃 $a2$,$2$ 矿井吃 $b2$。

讨论这个矿车去哪个矿井,计算一下就行。

$f[i][a2][a[i]][b1][b2] = max(f[i][a2][a[i]][b1][b2],f[i-1][a1][a2][b1][b2] + calc(a[i],a2,a1));$
$f[i][a1][a2][b2][a[i]] = max(f[i][a1][a2][b2][a[i]],f[i-1][a1][a2][b1][b2] + calc(a[i],b2,b1));$

P2051

三进制状压!对于海洋题显然la了。

设计 $f[i][j][k]$ 统计前 $i$ 行有 $j$ 列填了 $1$ 个,$k$ 列填了 $2$ 个。

分类讨论就行。

f[i][j][k] += f[i-1][j][k]%mod;//0
if(j >= 1) f[i][j][k] = (f[i][j][k] + f[i-1][j-1][k]*(m-(j-1)-k))%mod;//1
if(k >= 1)f[i][j][k] = (f[i][j][k] + f[i-1][j+1][k-1]*(j+1))%mod;//2
if(j >= 2)f[i][j][k] = (f[i][j][k] + f[i-1][j-2][k]*C(m-(j-2)-k))%mod;//3
if(k >= 1)f[i][j][k] =(f[i][j][k] + f[i-1][j][k-1]*j*(m-j-(k-1)))%mod;//4
if(k >= 2)f[i][j][k] = (f[i][j][k] + f[i-1][j+2][k-2]*C(j+2))%mod;//5