最长递增子序列问题是个蛮典型的动态规划问题,相关也有很多人写过文章,经过理解的话,自己整理如下:
1 DP问题要找到当前问题与子问题:以dp[]数组记录各个位置[i]处数字为最后一个数字的最长序列,
当前问题:dp[i],与子问题的联系为,比子问题的长度+1
子问题:max{dp[0~i-1]}
2. 如何得到子问题的结果:依赖于[i]处数字可以support的数值,即比[i]处数字小且位于0~i-1位置的数字
根据这两点,我们得到了问题的解决办法:①得到[i]的支撑数组②dp求解
相应代码如下:
class Solution{ public: int getLongestSeq(vector<int> arr){ int size=arr.size(); vector<int> len(size,1); vector<vector<int> > connect(size,vector<int>()); //将与当前数字相关的前边的index存储,以转化子问题时可以直接使用 for(int i=0;i<size;i++){ for(int j=0;j<i;j++){ if(arr[j]<arr[i]) connect[i].push_back(j); } } for(int i=0;i<size;i++){ int addition=0; for(vector<int>::iterator it=connect[i].begin();it!=connect[i].end();it++){ if(addition<len[*it]) addition=len[*it]; } len[i]=addition+1; } int result=1; for(int i=0;i<size;i++){ if(result<len[i]) result=len[i]; } return result; } };