dp
P1772
设\(f_i\)为第\(i\)天的最小总代价,枚举上一次改变的\(j\),那么转移方程为:
\[f_i=f_j+cost(j+1,i)\times(i-j)+k
\]
cost可以直接暴力计算。
时间为\(O(n^2e\log e)\),瓶颈在于cost的暴力计算
CF1312E
不会,看题解:
CF1485F
第一种做法:
0.\(b_i = a_i\)
1.\(b_i = \sum_{j=1}^i a_i\)
给定\(b\),求\(a\)个数
如果相等,那么会记重
因为有些操作序列获得的\(a\)是完全一样的
我们优先选择0。
比如:\(b={0,0},a={0,0}\)
\({1,1}\)是不合法的,只有\({0,0}\)合法。
那么我们对\(0/1\)操作序列进行dp
设$f_{i,0/1} $ 第\(i\)个操作(0,1含义如上)的方案书
我们可以写出如下转移方程式
\[f_{i,0} = f_{i-1,0}+f_{i-1,1} \\
f_{i,1} = f_{i-1,0}+f_{i-1,1} - 不合法
\]
不合法的只有:
\[\sum_{j=1}^{i-1}a_j = 0
\]
那么我需要找的一个\(f_{j,1}\)
易得为\(s_{j-1} = s_{i-1}\)
用mp维护即可
第二种做法:
CF1209E2
松/紧限制做法
只有最大值是前[1,n]大的才可以。
\(r_i\):第i行随便选
\(f_{i,S}\):考虑前i列,每一行是否已经选出\(r_i\),我们将这个记成二进制数\(S\)
枚举子集
\(f_{i,S}\Longrightarrow f_{i+1, T|C_{U}S}\)
设\(g_T\)为在第\({i+1}\)列选出集合\(T\)的最大值
那么时间为\((2^n n^2 + 3^n n)\)
dp题只能多做
浙公网安备 33010602011771号