算法第三章作业
题目:单调递增最长子序列
问题描述:
设计一个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]; int len[n]; for(int i=0;i<n;i++) cin>>nums[i]; len[0]=1; for(int i=1;i<n;i++) { len[i]=1; for(int j=0;j<i;j++) { if(nums[i]>nums[j]&&len[j]+1>len[i]) { len[i]=len[j]+1; } } } int max=0; for(int i=0;i<n;i++) { if(len[i]>max) max=len[i]; } cout<<max<<endl; }
1.算法分析:
1.1 根据最优子结构性质,列出递归方程式
len[i]={max(len[j])+1, 1<=j<=i且a[j]<a[i]}
1.2 填表法中表的维度、填表范围和填表顺序。
维度:1维
填表范围:0<i<n
填表顺序:自左向右
1.3 该算法的时间和空间复杂度
O(N^2)
2. 对动态规划算法的理解
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。
3. 说明结对编程情况
这次结对编程我们合作的题目是最低通行费问题。在结对编程中,我们利用时间比较多的这一个优点,先分别进行了独立编程,规定时间内各自都打出来了,然后再进行了交流, 发现大家思路几乎相同,只是解题方法编程代码不一样,但也同时让我们学会探讨一题的多种解题思路哪种更加优化。