算法第三章作业

1.选自题目:单调递增最长子序列

1.1 d[i]表示以第i个数为结尾的最长递增子序列,a[i]表示输入的序列;递归方程式为:d[i] = max{d[j] + 1}   (0 <= j < i 且 a[i] > a[j])  ;将a[0]、d[0]均初始化为0

1.2 表的维度:一维;填表范围:1 ~ n; 填表顺序:自左向右

1.3 时间复杂度:双重循环,O(N2); 空间复杂度:用一维数组储存,O(N)

代码如下:

#include<iostream>
using namespace std;
int n;
int a[1000];
int d[1000];

int LIS(){
    
    a[0] = 0;
    d[0] = 0; 
    int ans = 0;
    for(int i = 1;i <= n;i++){
        int x = 0;
        for(int j = 0; j < i;j++){
            if(a[j] < a[i])
                x = max(x,d[j]);//寻找最大那个数
        }
        d[i] = x + 1; //加个1
        ans = max(ans,d[i]); //最长单调递增子序列
    }
    return ans;
}

int main(){
    cin >> n;
    for(int i = 1;i <= n;i++){
        cin >> a[i];
    }
    cout << LIS();
    return 0;
    
    
} 

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

将一个规模较大的问题转换成一个或若干个规模较小的子问题,找到递归关系,写出递归方程式;在使用递归求解规模较小的问题时存在子问题重复求解的现象,那么就建立一张表来记录需要重复求解的子问题。

3.结对编程情况:

卡在了如何列出递归方程式上

posted @ 2020-10-31 12:42  할수있어  阅读(73)  评论(0编辑  收藏  举报