1、什么是状态空间?我们把问题的初始形态、要达到的目标状态,以及中间经过的所有中间形态叫做状态空间
2、搜索的要素是什么?初态、边界、所有可能的状态。由于dp常常不好想,所以转而先想搜索
3、搜索的步骤:(1)定义状态(哪些是全局变量,哪些是局部变量?需要哪些参数)(2)推导(怎么从一个状态到达下一个状态)。dp在(1)(2)之间多了一步简化状态(用最少的值去代表一个状态)
4、最长上升子序列:中间:下标序列,状态空间:所有可能下标序列
void dfs (int len, int tail) {
if (len > ans) {
ans = len;
}
for (int i = tail + 1; i <= n; i ++)
if (a[i] > a[tail])
dfs (len + 1, i);
}
a[0] = -(1 << 30);
5、什么是满足最优子结构?当子结构之间可以用最优解或代表元素来推导时,我们就说这个问题满足最优子结构。
for (int i = 0; i < n; i++)
for (int j = i + 1; j <= n ; j++)
if (a[i] > a[j]) f[j] = max (f[j], f[i] + 1)//因为不一定把这个接上去就是最长的,所以要取最大值
第二种:考虑f[i]由哪些状态得到
for (int i = 1; i <= n; i++)
for (int j = 0; j < i; j ++)
if (a[i] > a[j]) f[i] = max (f[i], f[j] + 1);
6、为什么dp比搜索快呢?因为我们用一个代表元素代表了一堆子结构,借此来推导。
7、动态规划需要满足什么性质?需要满足拓扑排序的顺序。(无后效性);子问题重叠性;最优子结构性;
8、动态规划的三要素是什么?状态、阶段、决策、