最长递增子序列问题是个蛮典型的动态规划问题,相关也有很多人写过文章,经过理解的话,自己整理如下:

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

 

posted on 2015-09-11 15:39  KarayLee  阅读(149)  评论(0)    收藏  举报