Longest increasing substring2 --DP

除了上文外,还可将LIS抽象为最长子序列。


1.此类问题通常可以转化为求最长子串问题(即保持原来的相对次序不变)。


例如最长对链:

Input: [[1,2], [2,3], [3,4]]
Output: 2
Explanation: The longest chain is [1,2] -> [3,4]


因为结果链子(s1,e1)->(s2,e2)->...->(sn,e2)一定满足:

s1<s2<s3...<sn

e1<e2<e3<...<en


因此可将原来的pair按照start/end point递增排序。

则最后的结果即为排序后的序列的最长子序列。


2.对于最长子序列问题则可使用上一篇文章中所描述的方法解决。

具体为:从小到大,依次求以第i个序列为结尾的最长子序列的长度。

必可表示为以j个序列为结尾的最长子序列的数值+1

其中j满足以下条件:

j在i的位置前面;

j和i满足所要求的比较关系;

j是满足以上条件的长度最大的数。


代码:

int findLongestChain(vector<vector<int>>& pairs) {

          int size = pairs.size();

          sort(pairs.begin(), pairs.end(), custom);

          int opt[size]; //

          for(int i = 0; i < size; i++) opt[i] = 1;

          int ans = 0;

          for (int i = 1; i < size; i++) {

            for (int j = 0; j < i; j++) {

                if (pairs[j][1] < pairs[i][0] && (opt[j] + 1) > opt[i])

                    opt[i] = opt[j] + 1;

            }

          ans = opt[i] > ans ? opt[i] : ans;

          }

          return ans;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值