算法第三章作业

一 . 对动态规划算法的理解

动态规划同分治法类似,也是将问题分成子问题,先求解子问题,但是动态规划的问题中,分解后的子问题不是独立的,所以,用一个表来记录已解决的子问题,不管这个解在后续的过程中会不会用到,都将它填入表中。

步骤:

找出最优解的性质,递归的定义最优值,自底向上的计算最优值。

并且动态规划算法具有的两个重要的性质:最优子结构和子问题重叠

二 . 编程题

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;
                }
            }
        }
    }
}
void print(int i,int j){
    if(s[i][j]==0 ){
        cout << j << endl;
        return;
    }
}

三 . 结对编程情况

对于动态规划还不是很熟练,和队友编程时求解一道题要花很长的时间,要多多练习,与队友多讨论,交换思路共同理解问题。

 

posted @ 2018-11-10 19:39  Ygrittee  阅读(135)  评论(0编辑  收藏  举报