zoukankan      html  css  js  c++  java
  • 动态规划:最长上升子序列之基础(经典算法 n^2)

    解题心得:
    1、注意动态转移方程式,d[j]+1>d[i]>?d[i]=d[j]+1:d[i]
    2、动态规划的基本思想:将大的问题化为小的,再逐步扩大得到答案,但是小问题的基本性质要和大的问题相同。
    3、这是动态规划的经典方程式,但是耗时较多,在数据较大的时候会出现超时的情况。

    题目:

    1180: 最长上升子序列之基础
    Time Limit: 1000 MS Memory Limit: 65536 KB
    Total Submit: 166 Accepted: 79 Page View: 551
    Submit Status Discuss

    Description
    给出一个由n个数组成的序列x[1..n],找出它的最长单调上升子序列的长度。即找出最大的长度m和a1,
    a2……,am,使得 a1 < a2 < … … < am 且 x[a1] < x[a2] < … … < x[am]。

    Input
    先输入一个整数t(t<=200),代表测试组数。
    每组数据先输入一个N,代表有N个数(1<=N<=1000).
    输入N个正整数,a1,a2,a3…..an(0<=ai<=100000).

    Output
    每组输出一个整数,代表最长的长度。

    Sample Input
    1
    7
    1 7 3 5 9 4 4
    8
    Sample Output
    4

    #include<stdio.h>
    
    int main()
    {
        int t,n,num[1010];
        int len;   //记录最长的子序列
        int d[1010];    //记录从1开始到n的子序列长度
        scanf("%d",&t);
        while(t--)
        {
            len = 0;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%d",&num[i]);
            }
    
            for(int i=0;i<n;i++)
            {
                d[i] = 1;
                for(int j=0;j<i;j++)
                {
                    if(num[i] > num[j] && d[j] + 1 > d[i])//关键:判断上升则第i个肯定比第i之前的更大,d【i】则为之前的+1中的最大的那个
                    {
                        d[i] = d[j] +1;
                        if(d[i] > len)
                            len = d[i];
                    }
                }
            }
            printf("%d
    ",len);
        }
    }
    
  • 相关阅读:
    勤于思考,善于总结,积极进取,认识自己
    notepad++中cmd运行中文乱码?
    notpad++使用cmd的快捷键设置
    深刻理解Table以及关于table的插件(1)
    单向链表
    apriori算法
    保存一个班级的学生信息
    测试list列表中append和insert的执行速度
    二分查找
    顺序查找法
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107389.html
Copyright © 2011-2022 走看看