算法第三章作业
1、算法第三章为动态规划,动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干个问题,先求解子问题,再结合这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,经分解得到的子问题数目太多,以致最后解决原问题需要耗费指数级时间。如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样可以避免大量的重复计算,从而得到多项式时间计算算法。为了达到此目的,可以用一个表来记录所有已解决的子问题的答案。这就是动态规划发的基本思想。
动态规划算法适用于解最优化问题,通常可按以下4个步骤设计:
1)找出最优解的性质,并刻画其结构特征;
2)递归的定义最优值;
3)以自底向上的方式计算最优值;
4)根据计算最优值时得到的信息,构造最优解。
动态规划算法求解的问题有许多,例如矩阵连乘问题或求最大子段和问题等等。
举个例子,租游艇问题就是一个典型的动态规划求解的问题:
#include<iostream>
using namespace std;
int m[200][200];
int bargeMoney(int m[200][200], int n){
for (int r = 2; r <= n; r++){
for (int i = 1; i <= n - r + 1; i++){
int j = i + r - 1;
for (int k = i; k <= j; k++){
int t = m[i][k] + m[k][j];
if (t < m[i][j]){
m[i][j] = t;
}
}
}
}
return m[1][n];
}
int main()
{
int n, i, j;
cin >> n;
for (i = 1; i <= n - 1; i++){
for (j = i + 1; j <= n; j++){
cin >> m[i][j];
}
}
cout << bargeMoney(m, n) << endl;
return 0;
}
首先画图,推断出动态规划公式,再根据动态规划公式求出最优解,得出m[1][n]为最优解。此类的问题不少,但只要推断出动态规划的公式,一切都会迎刃而解。
2、
第一题:
int max=0; for(int i=0;i<n;i++){ if(max<l[i]){ max=l[i]; } }
第二题:
int t = m[i][k] + m[k][j]; if (t < m[i][j]){ m[i][j] = t; }
3、结对编程汇报:一起努力,打题更轻松~