动态规划——最长递增子序列

最长递增子序列

题目

给一个整数类型的数组,或者给一个字符串,问题就是找出这个字符串里面,最长的递增子序列。【可能是严格递增的,也可能是不严格递增的,只需要在状态转移方程的时候,多加一个括号即可】

思想

无论如何,我们开一个动态规划数组dp。dp[i]表示的是,以当前nums[i]或者第i个字符结尾的子序列或者字符串的最长递增子序列。【注意:nums[i]或者第i个字符是一定要取的】

那么,dp[i]等于什么呢?最小值一定是1对吧【即只有本身这个数字或者字符】,然后,其他的可以从前面所有的数字或者字符中,只要数字或者字符比它小的,就可以加1后与当前值比较,如果大于,则更新dp[i]的数值。【加1是因为这个数字或者字符是一定要取到的】。并且,最长子序列不一定是在最后一个位置取到,因为它是当前位置一定要取到的,所以反而最后一个数字或者字符太小,限制了长度。我们每次在取完之后,就要更新当前的数值。

代码

//数字下标从0开始,因为0只有1个,所以不用进行dp。
//只需要从下标为1的位置开始dp即可
  for (int i=1;i<length;++i)
        {
            dp[i]=1;//该状态由本身转化而来,至少有一个,即本身
            for (int j=0;j<i;++j)
            {
                if (nums[i]>nums[j]) //可以由比它小的数这个状态转移过来,只要该数比它小就可以加1进行比较
                    dp[i]=Math.max(dp[i],dp[j]+1);
            }
            ans=Math.max(ans,dp[i]); //每次都要取出dp[i]中最大的那一个作为结果
        }

结果

动态规划太秀了,真的6,大神的脑壳每天都在思考啥?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值