算法第三章作业
3-2 单调递增最长子序列 (25分)
设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
输入格式:
输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开
输出格式:
最长单调递增子序列的长度
输入样例:
在这里给出一组输入。例如:
5
1 3 5 2 9
输出样例:
在这里给出相应的输出。例如:
4
#include<iostream> using namespace std; int a[10000], dp[10000]; int n; int LIS() { int ans = 1; for (int i = 1; i <= n; i++) { dp[i] = 1; for (int j = 1; j < i; j++) { if (a[i] > a[j]) { dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); } return ans; } int main() { while (cin >> n) { for (int i = 1; i <= n; i++) { cin >> a[i]; } int ans = LIS(); cout << ans << endl; } return 0; }
根据最优子结构性质,列出递归方程式
len[i]={max(len[j])+1}
给出填表法中表的维度、填表范围和填表顺序
维度:一维
填表范围:1到n
填表顺序:从左到右
分析该算法的时间和空间复杂度
时间复杂度:O(n^2)
空间复杂度:O(n)
你对动态规划算法的理解
动态规划法是求解决策过程最优化的过程,动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
其基本思路是用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。
我们解决动态规划问题一般分为四步:
1、定义一个状态,这是一个最优解的结构特征
2、进行状态递推,得到递推公式
3、进行初始化
4、返回结果
说明结对编程情况
与队友一起编程让我在编程中有了一起讨论的对象,在遇到问题时可以相互讨论,求出最优解,在编程效率上有了很大的提高,也使我的编程能力有了很大的提高。