动态规划思路

这一题的大致思路前面的题解都说的很清楚了,就是编号 i 的同学,找到:

  1. 左边小于该同学身高的个数
  2. 右边大于该同学身高的个数

而在寻找个数的过程中就用到了动态规划的思想,假设对于当前身高为 197 的同学来说,要找到左边小于它的所有个数

alt

如果它找到了身高为 160 同学,很明显 160<197,所以是满足条件的,而 160 在左边找到比自己身高要低的。 alt

所以,我们的工作总结起来就是:

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;
}