第三章作业总结

一、动态规划算法的理解

   动态规划的算法从某方面来说是一个决策问题。举个例子,小明从起点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 }

三、结对编程总结

要好好学习动态规划,有点模糊。

猜你喜欢

转载自www.cnblogs.com/lycsuper/p/11787960.html