算法第三章作业

题目:单调递增最长子序列

问题描述:

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

输入格式:

输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格

输出格式:

最长单调递增子序列的长度

输入样例:

5
1 3 5 2 9

输出样例:

4

算法描述:

#include<iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int nums[n];
    int len[n];
    for(int i=0;i<n;i++)
      cin>>nums[i];
    len[0]=1;
    for(int i=1;i<n;i++)
    {
        len[i]=1;
        for(int j=0;j<i;j++)
        {
            if(nums[i]>nums[j]&&len[j]+1>len[i])
            {
                len[i]=len[j]+1;
            }
        }
    }
    int max=0;
    for(int i=0;i<n;i++)
    {
        if(len[i]>max)
          max=len[i];
    }
    cout<<max<<endl;
}

 

1.算法分析:

1.1 根据最优子结构性质,列出递归方程式

 len[i]={max(len[j])+1, 1<=j<=i且a[j]<a[i]}

1.2 填表法中表的维度、填表范围和填表顺序。

维度:1维 

填表范围:0<i<n

填表顺序:自左向右

1.3 该算法的时间和空间复杂度

 O(N^2)

2. 对动态规划算法的理解

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

3. 说明结对编程情况

这次结对编程我们合作的题目是最低通行费问题。在结对编程中,我们利用时间比较多的这一个优点,先分别进行了独立编程,规定时间内各自都打出来了,然后再进行了交流, 发现大家思路几乎相同,只是解题方法编程代码不一样,但也同时让我们学会探讨一题的多种解题思路哪种更加优化。

posted @ 2020-10-30 22:42  iiiiiiiiH  阅读(136)  评论(0编辑  收藏  举报