zoukankan      html  css  js  c++  java
  • 算法第三章作业

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

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

    步骤:

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

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

    二 . 编程题

    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;
        }
    }

    三 . 结对编程情况

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

  • 相关阅读:
    126
    125
    124
    123
    122
    121
    120
    119
    洛谷 P5407 【[THUPC2019]历史行程】
    济南清北学堂七日游
  • 原文地址:https://www.cnblogs.com/Ygrittee/p/9940365.html
Copyright © 2011-2022 走看看