题目:
单调递增最长子序列
设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
递归方程式:
dp[i]是从0到n-1
dp[i]表示的是从第1个数字到第i+1个数字的最大递增子序列
dp[i] = max{ dp[j]+1 , dp[i] } (1<i<n && 0 <=j<i)
这个是一个一维的数组,从左到右的填表,从1一直填到n-1(dp[0]能够确定为1的。不用填)
for(int i = 1; i < n; i++) { for(int j = i - 1; j >= 0; j--) { if(num[i] > num[j]) { dp[i] = max(dp[j] + 1, dp[i]); if(dp[i] > result) { result = dp[i]; } } } }
用到了两次循环,第一次是n-1,第二次一次从1到n-1所以O(n) = n^2
一维数组,所以空间复杂度S(n) = n.
动态规划这一章节已经结束了,从一开始不完全懵,到现在自己能够做题,对于动态规划的题目我感觉最难的部分就是理解题目,还有写出递归方程式,基本上主要写出了方程式,代码就不是问题了,只是有些时候要注意下方程式的情况是否全部都有包括进去,可能会遗漏一些比较特殊的情况。
结对编程:
感觉还好吧,基本都是先自己各自打自己的,有不会的话就直接去宿舍里问,然后一起讨论,比起个人学习来说的话效率高挺多的,因为网上的其实我并不能很好的看懂,不如别人讲来的清晰。