算法第三章作业

1.单调递增最长子序列

设计一个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 递归方程式

  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-27 17:22  郝梓呈  阅读(137)  评论(0编辑  收藏  举报