第三章作业

3-2 单调递增最长子序列 (25分)
设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
输入格式:
输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开
输出格式:
最长单调递增子序列的长度
输入样例:
在这里给出一组输入。例如:
5
1 3 5 2 9
输出样例:
在这里给出相应的输出。例如:
4


代码:
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n],b[n];
    for(int i=0;i<n;i++)   
	{
	cin>>a[i];
	b[i]=1;
	}
	for (int i = 1; i < n; i++) {
		
		
		for (int j = 0; j < i; j++)
		{
			if (a[j] < a[i]&& b[j]>b[i] - 1) {
				b[i] = b[j] + 1;
			}
			
		}
	
	} 
	int max=b[1];
    for(int i=0;i<n;i++)
    {if(max<b[i]) max=b[i];
        
    }
    cout<<max;
    
}
1.1  当a[j] < a[i]且b[j]>b[i] - 1 ,answer=max{1,b[i]=b[j]+1}
1.2b[n]和a[n]均为一维,填表范围为1-n,顺序从1-n
1.3时间复杂度:双重循环:O(n^2)
  空间复杂度:一维数组 O(n)
2、你对动态规划算法的理解
动态规划算法实际上是将大问题分成一个个小问题,然后确定好边界,在根据最优质结构性质,利用好递归方程式就可以得出答案。并且用备忘录的方式大大减少了算法的复杂度。
3.,这星期交流较少,两人用的方法不同,但后来互相讲解都能明白

  

posted on 2020-11-01 08:50  绮雯  阅读(98)  评论(0编辑  收藏  举报