算法第三章作业
题目:单调递增最长子序列
问题描述:
设计一个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. 说明结对编程情况
编程速度还不够快,通常在编写的时候会和队友讨论编程,遇到卡住的地方也会问问其他同学,有些错误是数据初始化使用错误,还有其他的一些问题,其实下次先思考好怎么写而不是一上来就直接动手会更好。