• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-80  評(píng)論-24  文章-0  trackbacks-0
            問題:一個(gè)8 * 8矩陣a[8][8],要求找到一條從a[0][0]到a[7][7]的路徑,使得該路徑上各點(diǎn)之和值最大,并且規(guī)定每個(gè)點(diǎn)只能向下走或者向右走。

            仔細(xì)想一想其實(shí)就是個(gè)簡(jiǎn)單的DP問題:
            若i > 0 && j > 0 則path_value[i][j] = max{path_value[i - 1][j], path_value[i][j - 1]} + a[i][j];另外path_value[0][0] = a[0][0];對(duì)i > 0有path_value[i][0] = path_value[i - 1][0] + a[i][0];對(duì)j > 0有path_value[0][j] = path_value[0][j - 1] + a[0][j]。

            到此,該問題就迎刃而解了。代碼如下:

             1 void find_max(int **a, int n, int m, int *res) {
             2   if (a == NULL || *a == NULL ||  
             3       res == NULL || n < 1 || m < 1) {
             4     return;
             5   }
             6 
             7   int i, j;
             8   for (i = 0; i < n; ++i) {
             9     if (i == 0) {
            10       continue;
            11     }   
            12     *((int *)a + m * i) += *((int *)a + m * (i - 1));
            13   }
            14   for (i = 0; i < m; ++i) {
            15     if (i == 0) {
            16       continue;
            17     }   
            18     *((int *)a + i) += *((int *)a + i - 1); 
            19   }
            20   for (i = 1; i < n; ++i) {
            21     for (j = 1; j < m; ++j) {
            22       *((int *)a + m * i + j) +=  
            23         MAX(*((int *)a + m * (i - 1) + j), *((int *)a + m * i + j - 1));
            24     }   
            25   }
            26   *res = *((int *)a + m * (n - 1) + m - 1); 
            27 }

            這里將傳入的二維數(shù)組實(shí)參轉(zhuǎn)化成指針的指針來傳入。

            現(xiàn)在假設(shè)有個(gè)限制k,要求所求得的最大值不能大于k,也就是求路徑和最大,且不超過k的值是多少。
            這時(shí)候我是想不到如何用動(dòng)態(tài)規(guī)劃算法如何解決了。因?yàn)榫仃囍挥? * 8,所以可以考慮用暴力dfs來解決,注意回溯即可。代碼如下:

             1 void find_max_less_than_k(int **a, int n, int m, int x, int y, int k, int *res) {
             2   if (a == NULL || *a == NULL ||  
             3       res == NULL || n < 1 || m < 1 || x < 0 || y < 0) {
             4     return;
             5   }
             6 
             7   if (x == n - 1 && y == m - 1) {
             8     if (*((int *)a + m * x + y) <= k && 
             9         *((int *)a + m * x + y) > *res) {
            10       *res = *((int *)a + m * x + y);
            11     }
            12     return;
            13   }
            14 
            15   if (x < n - 1) {
            16     int resx = 0;
            17     int tempx = *((int *)a + m * (x + 1) + y);
            18     *((int *)a + m * (x + 1) + y) += *((int *)a + m * x + y);
            19     find_max_less_than_k(a, n, m, x + 1, y, k, &resx);
            20     if (resx <= k && resx > *res) {
            21       *res = resx;
            22     }
            23     *((int *)a + m * (x + 1) + y) = tempx;
            24   }
            25 
            26   if (y < m - 1) {
            27     int resy = 0;
            28     int tempy = *((int *)a + m * x + y + 1);
            29     *((int *)a + m * x + y + 1) += *((int *)a + m * x + y);
            30     find_max_less_than_k(a, n, m, x, y + 1, k, &resy);
            31     if (resy <= k && resy > *res) {
            32       *res = resy;
            33     }
            34     *((int *)a + m * x + y + 1) = tempy;
            35   }
            36 }

            這題不難,但是寫代碼要注意細(xì)節(jié)的處理。
            posted on 2012-09-06 14:35 myjfm 閱讀(552) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 算法基礎(chǔ)
            色综合久久中文色婷婷| 久久亚洲国产精品123区| 久久综合狠狠综合久久综合88 | 9久久9久久精品| 91精品国产色综久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 人人狠狠综合久久亚洲| 亚洲精品乱码久久久久久蜜桃图片 | 久久午夜综合久久| 一本一本久久A久久综合精品| 久久99国产综合精品女同| 久久综合视频网站| 一本一道久久精品综合| 亚洲国产精品无码久久一线| 国产巨作麻豆欧美亚洲综合久久| 亚洲精品美女久久久久99| 性做久久久久久久久| 日韩亚洲欧美久久久www综合网| 囯产精品久久久久久久久蜜桃| 精品无码人妻久久久久久| 精品综合久久久久久888蜜芽| 久久综合九色综合欧美就去吻| 免费观看久久精彩视频| 国产精品99久久99久久久| 久久亚洲AV成人无码国产| 国内高清久久久久久| 精品久久久一二三区| 香港aa三级久久三级老师2021国产三级精品三级在 | 精品国产一区二区三区久久| 午夜天堂精品久久久久| 久久无码AV中文出轨人妻| 亚洲国产综合久久天堂 | 国产一区二区精品久久岳| 亚洲国产精品久久久久网站 | 久久久久亚洲AV成人网人人软件| 久久青青草原精品影院| 99热都是精品久久久久久| 国内精品伊人久久久久影院对白 | 偷偷做久久久久网站| 色妞色综合久久夜夜| 亚洲中文字幕无码久久综合网|