算法第三章作业

1. 你对动态规划算法的理解

动态规划常常适用于有重叠子问题最优子结构性质的问题,用时往往远少于平时用的解法。分开解决问题的时候,许多子问题非常相似和相同,为此可以尝试将所解决过的子问题记录下来,下次使用就不需要重新计算,动态规划法仅仅解决每个子问题一次,从而减少计算量,提高了效率。

 

2. 分别列出编程题1、2的递归方程

编程题1:

单调递增最长子序列
int lcs(int n, int s1[], int s2[]) { //在老师原有的代码上做修改,将原序列跟排序后的序列做公共子序列比较
    for (int i = 0; i < n; i++)
        m[i][0] = 0;
    for (int j = 0; j < n; j++)
        m[0][j] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (s1[i-1] == s2[j-1])
                m[i][j] = m[i-1][j-1] + 1;
            else {
                m[i][j] = max(m[i-1][j], m[i][j-1]);
            }
        }
    }
    return m[n][n];
}

 

编程题2:

租用游艇问题

for(int k=2; k<=n-1; k++) //最后还是选择了这种方法,一开始是怎么循环困扰了好久,后来讨论和参考网上的答案后写出来的
  for(i=1; i<=n-k; i++)
    for(j=i+1; j<i+k; j++)
      r[i][i+k] = min(r[i][j]+r[j][i+k], r[i][i+k]);

 

3. 说明结对编程情况

由于这周比较忙,跟队友讨论的比较少,而且很巧的是我们卡住的点都差不多,所有讨论了很久也没有讨论出好的结果,第二题仍然没有解决,每次都是有头绪了但是做了做又不太对,希望能尽快想去解决方法。最后选择不另外写一个动态规划的方法,直接在主函数里循环。

posted @ 2018-11-04 23:52  liujieyu  阅读(118)  评论(0编辑  收藏  举报