一、动态规划算法的理解
动态规划的算法从某方面来说是一个决策问题。举个例子,小明从起点a要到目的地d,中途可能会经过b1、b2、b3、c1、c2、c3,而经过这些地方的花费不同,小明要如何走才能使得花费最大?
从动态规划的角度讲,如果小明能知道从b到d的最短费用(cost[b][d])再加上cost([a][b])的最小费用,就可以知道他到达终点d的最优解了。而要知道cost[b][d],必须先知道min(cost[c][d])......这样层层递归,把一个大的问题分解为一个个小的问题,而这些小问题又互相依赖,有先后顺序,小问题的最优解又关系到大问题的最终解,这就是从决策方面来讲的一种动态规划。动态规划常常借助二维数组作为表格,来记录一个个小问题的递进,最终得到大问题的答案。
二、编程题1、2的递归方程
1.单调递增最长子序列
假设a[j]表示以第j个数结尾的最长单调递增子序列。
其递归方程为 a[i] = max(a[j] + 1, a[i]) (i >= 1, 0 <= j < i)
1 int max_length(int n, int a[]){ 2 for(int end = 1; end < n; end++){ 3 for(int start = 0;start < end ; start++){ 4 if(a[end] > a[start] && length[end] < length[start] + 1) length[end] = length[start] + 1; 5 } 6 } 7 int max_length = length[0]; 8 for(int i = 0; i < n; i++){ 9 if(max_length < length[i]) max_length = length[i]; 10 } 11 return max_length; 12 }
2.租用游艇问题
假设cost[i][j]表示从站点i到站点j的最小花费。
cost[i][j] = max(cost[i][j], cost[i][k]+cost[k][j]) (1 <= i < n, i < j <= n, i <= k <= j)
1 void minzj(int b[201][201], int n) 2 { 3 4 for(int r=2;r<=n;r++) 5 { 6 for(int i=1;i<=n-r+1;i++) 7 { 8 int j = i+r-1; 9 for(int k=i+1;k<j;k++) 10 { 11 int t = b[i][k] + b[k][j]; 12 if(t<b[i][j]) 13 { 14 b[i][j] = t; 15 } 16 } 17 } 18 } 19 }
三、结对编程总结
要好好学习动态规划,有点模糊。