一、对动态规划的理解
动态规划算法的思想为:当前问题的最优解必定是在子问题的最优解的基础上求得的,进而去求子问题的最优解,通过不断递归之后,由初始状态的最优解以自底向上的方式不断动态地得到当前问题的最优解。
二、编程题1、2的递归方程
(1)编程题1的递归方程:
1 for (int i = 0; i < n; i++) { 2 note[i] = 1;//note数组初始化 3 for (int j = 0; j < i; j++) {//note[i]记录list[i]作为单调递增子序列的最后一个元素的长度 4 if (list[i] > list[j] && note[i] < note[j] + 1) 5 note[i] = note[j] + 1; 6 } 7 if (i == 0) { 8 Max[i] = 1; 9 continue; 10 } 11 else { 12 Max[i] = note[i] > Max[i - 1] ? note[i] : Max[i-1]; 13 }//Max[i]记录前i+1个元素组成的序列中单调递增最长子序列的长度 14 }
定义两个辅助一维数组note,Max,在遍历list数组中,当前访问第i个元素时,遍历第一个元素到第i - 1个元素,更新note[i];再通过note[i]与Max[i - 1]填写Max[i]。
最终Max[n - 1]的值即为所求问题的解。
(2)编程题2的递归方程:
1 for (int i = n - 1; i > 0; i--) { 2 for (int j = i + 1; j < n + 1; j++) { 3 min[i][j] = money[i][j];//初始化min数组 4 for (int k = i + 1; k < j; k++) { 5 //若第i站到第k站,再由第k站到第j站的价格小于min[i][j],更新min[i][j] 6 if (min[i][k] + min[k][j] < min[i][j]) 7 min[i][j] = min[i][k] + min[k][j]; 8 } 9 } 10 }
定义一个二维辅助数组min[i][j],记录由第i站到第j站的最小价格。由上游第一站往下填写min数组,最终min[1][n]的值即为所求问题的答案。
三、结队编程情况
本次结队编程为了加深各自对动态规划的理解,我们选择独立编程,编程完成或是遇见困难思考了一段时间后,再交流各自的思路,以及编程方法。总体来看,我们的思路基本一致,算法的编写方式稍有不同。