算法第三章作业
1.选自题目:单调递增最长子序列
1.1 d[i]表示以第i个数为结尾的最长递增子序列,a[i]表示输入的序列;递归方程式为:d[i] = max{d[j] + 1} (0 <= j < i 且 a[i] > a[j]) ;将a[0]、d[0]均初始化为0
1.2 表的维度:一维;填表范围:1 ~ n; 填表顺序:自左向右
1.3 时间复杂度:双重循环,O(N2); 空间复杂度:用一维数组储存,O(N)
代码如下:
#include<iostream> using namespace std; int n; int a[1000]; int d[1000]; int LIS(){ a[0] = 0; d[0] = 0; int ans = 0; for(int i = 1;i <= n;i++){ int x = 0; for(int j = 0; j < i;j++){ if(a[j] < a[i]) x = max(x,d[j]);//寻找最大那个数 } d[i] = x + 1; //加个1 ans = max(ans,d[i]); //最长单调递增子序列 } return ans; } int main(){ cin >> n; for(int i = 1;i <= n;i++){ cin >> a[i]; } cout << LIS(); return 0; }
2.对动态规划算法的理解:
将一个规模较大的问题转换成一个或若干个规模较小的子问题,找到递归关系,写出递归方程式;在使用递归求解规模较小的问题时存在子问题重复求解的现象,那么就建立一张表来记录需要重复求解的子问题。
3.结对编程情况:
卡在了如何列出递归方程式上