算法第三章作业

题目:单调递增最长子序列

问题描述:

设计一个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+1];
for(int i=1;i<=n;i++){
cin>>nums[i];
}
int b[n+1]={0},c[n+1]={0},last[n+1]={0},maxLen=0;
c[1]=1,last[1]=1;
for (int i=1;i<=n;i++)
{
for (int j=1;j<i;j++)
{
if(nums[j]<nums[i] && c[j]+1>c[i])
{
c[i]=c[j]+1;
b[i]=j;
last[i]=i;
maxLen=c[i];
}else if(c[j]>c[i]){
maxLen=c[j];
last[i]=last[j];
}
}
}
cout<<maxLen<<endl;
return 0;
}

复制代码

 

1.算法分析:

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

 for循环,if语句判断,m[i]=max(m[j])+1

1.2 填表法中表的维度、填表范围和填表顺序。

维度:1维 

填表范围:0<i<n

填表顺序:自左向右

1.3 该算法的时间和空间复杂度

 O(N^2)  O(N)

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

动态规划不是算法,它是一种方法,它是在一件事情发生的过程中寻找最优值的方法,因此,我们需要对这件事情所发生的过程进行考虑。而通常我们从过程的最后一步开始考虑,而不是先考虑过程的开始。主要分4个步骤,先找出最优解的特征,第二写出它的递归方程式,第三是自底向上算出子结构的最优解,最后是计算最优解。

3. 说明结对编程情况

编程速度还不够快,通常在编写的时候会和队友讨论编程,遇到卡住的地方也会问问其他同学,有些错误是数据初始化使用错误,还有其他的一些问题,其实下次先思考好怎么写而不是一上来就直接动手会更好。

posted @ 2020-11-01 11:36  梦寻阳  阅读(181)  评论(0编辑  收藏  举报