zoukankan      html  css  js  c++  java
  • 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!

    来源:点击打开链接

    最长上升子序列的考察,是一个简单的DP问题。我们每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(1,dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。

    这个没有优化,效率是O(N^2),可以通过二分进行进一步的优化。

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int dp[1009];
    int a[1009];
    
    int lis(int n)
    {
        int sum=0;
        dp[0]=a[0];
        for(int i=1;i<n;i++)
        {
            dp[i]=a[i];
            for(int j=0;j<i;j++)
            {
                if(a[i]>a[j] && dp[i]<dp[j]+a[i])
                {
                    dp[i]=dp[j]+a[i];
                }
                if(sum<dp[i])
                    sum=dp[i];
            }
        }
        return sum;
    }
    
    int main()
    {
        int testcase;
        while(cin>>testcase && testcase!=0)
        {
            memset(dp,0,sizeof(dp));
            memset(a,0,sizeof(a));
            for(int i=0;i<testcase;i++)
            {
                cin>>a[i];
            }
            cout<<lis(testcase)<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    mac 端口转发方案
    Js 函数
    for 循环语句 与 while 循环
    Javascript 基础2
    Javascript 基础 1
    设计模式学习(一)-概述
    java基础知识-对象和类
    java基础知识-(数组)
    Java面试-框架篇(SSM-SpringMVC)
    Java面试-框架篇(SSM-Mybatis)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3237077.html
Copyright © 2011-2022 走看看