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