动态规划思路
这一题的大致思路前面的题解都说的很清楚了,就是编号 i 的同学,找到:
- 左边小于该同学身高的个数
- 右边大于该同学身高的个数
而在寻找个数的过程中就用到了动态规划的思想,假设对于当前身高为 197 的同学来说,要找到左边小于它的所有个数
如果它找到了身高为 160 同学,很明显 160<197,所以是满足条件的,而 160 在左边找到比自己身高要低的。
所以,我们的工作总结起来就是:
for (int i=0; i<height.size(); i++) { // 把 height[i] 当作身高最高的,找到左边比它小的
vector<int> tmpDict(i+1);
for(int j=0; j<i; j++) {
// j 同学身高是否小于 i 同学身高
if (height[j] < height[i]) {
// 当小于的时候,就记录该处的连续增大身高子序列的大小
tmpDict[j] = dp[j] + 1; // !!! 注意:这里使用 dp[j],因为 dp[j] 保存了 j 位置连续增大身高子序列大小
}
}
// 针对每个 j 同学的身高都判断完以后,我们选择的是最大子序列的那位同学
int maxVal = 0;
for (int k=0; k<tmpDict.size(); k++) {
maxVal = max(maxVal, tmpDict[k]);
}
// 注意!!! 这处的 i 同学最大增长子序列就已经找到了
dp[i] = maxVal;
}