算法第三章作业

3-2 单调递增最长子序列 (25分)
 

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

输入格式:

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

输出格式:

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

输入样例:

在这里给出一组输入。例如:

5
1 3 5 2 9
 

输出样例:

在这里给出相应的输出。例如:

4

#include<iostream>
using namespace std;
int a[10000], dp[10000];
int n;
int LIS() {
    int ans = 1;
    for (int i = 1; i <= n; i++)
    {
        dp[i] = 1;
        for (int j = 1; j < i; j++)
        {
            if (a[i] > a[j])
            {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        ans = max(ans, dp[i]);
    }
    return ans;
}
int main()
{
    while (cin >> n)
    {
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
        }
        int ans = LIS();
        cout << ans << endl;
    }
    return 0;
}

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

len[i]={max(len[j])+1}

给出填表法中表的维度、填表范围和填表顺序

维度:一维

填表范围:1到n

填表顺序:从左到右

分析该算法的时间和空间复杂度

时间复杂度:O(n^2)

空间复杂度:O(n)

 

你对动态规划算法的理解

动态规划法是求解决策过程最优化的过程,动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

其基本思路是用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

我们解决动态规划问题一般分为四步:
1、定义一个状态,这是一个最优解的结构特征
2、进行状态递推,得到递推公式
3、进行初始化
4、返回结果

说明结对编程情况

与队友一起编程让我在编程中有了一起讨论的对象,在遇到问题时可以相互讨论,求出最优解,在编程效率上有了很大的提高,也使我的编程能力有了很大的提高。

posted @ 2020-11-01 00:47  软工1902龚俊杰  阅读(67)  评论(0编辑  收藏  举报