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

用动态规划求一个序列的最长严格递增子序列,将求整个序列的最长严格递增子序列分解成求以每个数字为结尾的最长严格递增子序列,最后取最大即可。

#include<iostream>

using namespace std;

int main(){
   int n;
   cin>>n;
   int a[n];
   int dp[n];    //存放以每个点作为结尾的递增子序列的长度!!!注意不要再用dp[n]={1}啦!!会出错!虽然我也不知道为什么
   for(int i=0;i<n;i++){cin>>a[i]; dp[i]=1;}   //可以输入顺便赋值dp初始值
   
   //思路:从1开始到n-1遍历,作为锚点。然后每个点循环一次,循环从0到锚点前一个,若该点小于锚点且该点的dp大于等于锚点的dp,则锚点dp=该点dp+1;   !!注意锚点一直在该点的后方!

   for(int i=1;i<n;i++){
      for(int j=0;j<i;j++){
        if(a[j]<a[i]&&dp[j]>=dp[i]) dp[i]=dp[j]+1;
      }
   }
   int max=1;
   for(int i=0;i<n;i++) if(dp[i]>max) max=dp[i];

   cout<<max;
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值