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.,这星期交流较少,两人用的方法不同,但后来互相讲解都能明白