算法第三章作业
一.对动态规划法的理解
1.基本思想概念:
与分治法相似,将待求解的问题分解成诺干个子问题,先求解子问题,然后从这些子问题的解得到问题的解。然而,当子问题数目太多,最后解决原问题需要耗费指数时间时,采用分治法是不理想的,这时候运用动态规划法,将已解决的子问题的解保存起来,在需要时再找出已求得的答案,避免大量额重复计算,从而获得多项式时间算法。
2.基本要素:
(1)最优子结构
(2)重叠子问题
(3)备忘录方法
3.步骤设计:
(1)找出最优解的性质,并刻画其结构特征;
(2)递归地定义最优值;
(3)自底向上的方法计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解。
二:7-1
int maxArray(int n, int array[]){
int *max = new int[n];
for(int i = 0; i < n; i++){
max[i] = 1;
}//设置一个数组来存放每个数组下标对应的最长递增子序列;
for(int i = 1; i < n; i++){
for(int j = 0; j < i; j++){
if(array[i] > array[j] && max[j] > max[i] - 1){
max[i] = max[j] + 1;//计算当前数组下标所含的最大递增数列(max的比较过滤掉对当前下标来说一样的数据)
}
}
}
int result = max[1];
for(int i = 0; i < n; i++){
if(max[i] > result){
result = max[i];
}
}
return result;
}
7-2
int leastRent(int n, int rent[100][100]){
for(int i = 2; i < n; i++){
for(int j = 0; j < n - i; j++){
int k = j + i;
for(int m = j + 1; m < k; m++){
int temp = rent[j][m] + rent[m][k];
if(temp < rent[j][k]){
rent[j][k] = temp;
}
}
}
}
return rent[0][n-1];
}
三:结队编程情况
我和我的同伴的考虑过用递归的方法来写,但由于我和我的同伴的太菜了,最终也没讨论出合适的递归方法,但还是有所收获在讨论过程,希望其他队的大佬们能向我们分享一下如何写出优秀代码