算法第三章作业
一 . 对动态规划算法的理解
动态规划同分治法类似,也是将问题分成子问题,先求解子问题,但是动态规划的问题中,分解后的子问题不是独立的,所以,用一个表来记录已解决的子问题,不管这个解在后续的过程中会不会用到,都将它填入表中。
步骤:
找出最优解的性质,递归的定义最优值,自底向上的计算最优值。
并且动态规划算法具有的两个重要的性质:最优子结构和子问题重叠
二 . 编程题
1 . 递归方程:
longest[ i ] = max{longest[ j+1 ],longest [ i ]}
代码:
int maxlist(int shuzu[], int len) { int longest[len]; for (int i=0; i < len; i++) longest[i] = 1; for (int j=1; j < len; j++) { for (int i=0; i<j; i++) { if (shuzu[j] > shuzu[i] && longest[j] < longest[i]+1){ longest[j] = longest[i] + 1; } } } int max = 0; for (int j=0; j < len; j++) { if (longest[j] > max) { max = longest[j]; } } return max; }
2 . 递归方程:
m[ i ][ j ] = max(m[ i, k ]+ m[ k ][ j ])
代码:
void rent(){
int i, j, k, d;
for(d = 3; d <= n; d++){
for(i = 1; i <= n - d + 1; i++){
j = i + d - 1;
for(k = i + 1; k < j; k++){
if(m[i][k] + m[k][j] < m[i][j]){
m[i][j] = m[i][k] + m[k][j];
s[i][j] = k;
}
}
}
}
}
int i, j, k, d;
for(d = 3; d <= n; d++){
for(i = 1; i <= n - d + 1; i++){
j = i + d - 1;
for(k = i + 1; k < j; k++){
if(m[i][k] + m[k][j] < m[i][j]){
m[i][j] = m[i][k] + m[k][j];
s[i][j] = k;
}
}
}
}
}
void print(int i,int j){
if(s[i][j]==0 ){
cout << j << endl;
return;
}
}
if(s[i][j]==0 ){
cout << j << endl;
return;
}
}
三 . 结对编程情况
对于动态规划还不是很熟练,和队友编程时求解一道题要花很长的时间,要多多练习,与队友多讨论,交换思路共同理解问题。