一、对动态规划算法的理解
动态规划算法与分治法类似,其基本思想是将待求解的问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。但是,适合用动态规划算法来求解的问题经分解得到的子问题往往不是相互独立的,而用分治法求解时则会对有些子问题进行重复的求解,以致耗费过多的时间,因此,动态规划引入了一个表格来记录已经求解了的子问题,避免重复求解。用动态规划法求解的主要步骤是分析最优解的性质,列出递归方程。
二、编程题的递归方程
1. 单调递增最长子序列
序列A = {a0,a1,...,ai,...an}, longest[i]表示序列A从a0到ai的单调递增子序列长度,初始值为1.
递归方程:longest[i] = max(longest[i], longest[j]+1) (i >= 1, 0 <= j < i)
1 int main() { 2 int n, max = 0, a[MAX], longest[MAX] = { 1 }; // 单调递增子序列长度至少为1;longest数组记录已解决的子问题的答案 3 cin >> n; 4 for (int i = 0; i < n; i++) 5 cin >> a[i]; 6 for (int i = 1; i < n; i++) { 7 for (int j = 0; j < i; j++) { 8 // 动态规划方程:longest[i] = max(longest[i], longest[j]+1),表是从左往右填 9 if (a[i] > a[j] && longest[i] < longest[j] + 1) 10 longest[i] = longest[j] + 1; 11 } 12 if (max < longest[i]) 13 max = longest[i]; 14 } 15 cout << max << endl; 16 return 0; 17 }
2. 租游艇问题
r[i][j]表示从第i个游艇出租站到第j个游艇出租站所需要的租金
递归方程:r[i][j] = max(r[i][j], r[i][k]+r[k][j]) (1 <= i < n, i < j <= n, i <= k <= j)
1 int minRent(int r[][MAX], int n) { 2 for (int i = 1; i < n; i++) { 3 for (int j = i+1; j <= n; j++) { 4 int t = r[i][j]; 5 for (int k = i; k <= j; k++) { 6 if (t > r[i][k] + r[k][j]) 7 t = r[i][k] + r[k][j]; 8 } 9 r[i][j] = t; 10 } 11 } 12 return r[1][n]; 13 }
三、结对编程情况汇总
挺好的,我们在编程的时候也会互相交流。