<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-28  評論-51  文章-10  trackbacks-0
    動態規劃的經典應用,其實現在發現,其實質就是利用矩陣或者數組保存歷史結果,而不用每次遞歸求解
    關鍵點:
    1.找出問題的遞歸表達式
    2.然后根據表達式,直接轉化為矩陣上的數據運算

    本問題的遞歸表達式為:
    L[i,j]等于 0      ifi=0 或者 j=0
                  等于L[i-1,j-1]+1   ifi>0 ,j>0 ai = bi
                  等于 max{L[i,j-1], L[i-1,j]} if i > 0 j>0, ai != bj


    純c實現
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define MAXSIZE 10
     4 static char * LCSarray;
     5 static char *start; //指向LCSarray數組中最長公共字串的開始位置
     6 int findLCS(char*int,  char*int );
     7 
     8 int main()
     9 {
    10     char * a = "0xyxxzxyzxy";  //第一位都沒有意義
    11     char *= "0zxzyyzxxyxxz";
    12 
    13     LCSarray = (char *)malloc(sizeof(char)*MAXSIZE);//保存最長公共字串的數組容器
    14     int LCSNum = findLCS(a,10, b, 12);
    15     printf("the result is: %d \n", LCSNum );
    16     printf("the result char is: %s \n", start );
    17     
    18     free(LCSarray);
    19      exit(EXIT_SUCCESS);
    20 }
    21 
    22 int findLCS(char * a, int na, char *b, int nb)
    23 {
    24     int i = 0, j = 0//i代表行下標j代表列下標
    25     int t = 0//保存最長公共字串的下標
    26     
    27     //以下構建矩陣
    28     int ** matrix = (int **)malloc(sizeof(int ** (na + 1));
    29     for(i =0; i <na+1; i++)
    30         matrix[i] = (int *) malloc(sizeof(int* (nb +1));
    31     //把第一行第一列都初始化為0
    32     for(j = 0; j < nb +1; j++)
    33     {
    34         matrix[0][j] = 0;
    35     }
    36     for(i = 0; i < na +1; i++)
    37     {
    38         matrix[i][0= 0;
    39     }
    40     //填該矩陣,即求解
    41     for(i = 1; i < na + 1; i++)
    42     {
    43         for(j = 1; j < nb + 1; j++)
    44         {
    45             if(a[i] == b[j])
    46             {
    47                 matrix[i][j] = matrix[i-1][j -1+ 1;
    48              }
    49               else
    50                  matrix[i][j] =matrix[i-1][j]>matrix[i][j-1]?matrix[i-1][j]:matrix[i][j-1];            
    51         }
    52         
    53     }
    54     //找出一個最大公共字串(一開始還以為是條捷徑呢,原來是謬誤,
    55     //因為只考慮最后一列比較,你不能確定較大值必定包含在全局的最大公共子序列中)
    56 //    int max = 0;
    57 //    for(i = 1; i < na +1; i++)
    58 //    {
    59 //        if(matrix[i][nb] > max)
    60 //        {
    61 //              LCSarray[t++] = a[i];
    62 //            max = matrix[i][nb];
    63 //         }
    64 //    }
    65 /*從matrix尾部縱向優先搜索,碰到兩個不同值時保存char,一直到第一行(其實最合理的應該最后搜索到matrix[1][1]節點)*/
    66     i = na;
    67     j = nb;
    68     char * p = LCSarray + MAXSIZE-1//指向尾部
    69     * p = '\0';
    70     while(i>0//縱向搜索
    71     {
    72         while(matrix[i][j] == matrix[i-1][j])
    73         {
    74             i--;
    75         };
    76         *--= a[i];
    77         i--;
    78         j--;
    79     }
    80     start = p;
    81     //矩陣最后一個元素即是我們所需的最長公共子序列的個數
    82     int result = matrix[na][nb];
    83     //釋放空間
    84     for(i =0; i <na+1; i++)
    85         free(matrix[i]);
    86     free(matrix);
    87     return result;
    88 }




    posted on 2008-04-06 22:51 fullfocus 閱讀(2504) 評論(1)  編輯  收藏 所屬分類: 算法

    評論:
    # re: 最長公共子序列問題-c實現 2008-10-01 17:48 | anont
    非常感謝  回復  更多評論
      
    主站蜘蛛池模板: 亚洲高清专区日韩精品| 97在线观免费视频观看| 亚洲免费一区二区| 瑟瑟网站免费网站入口| 曰批全过程免费视频免费看 | www亚洲一级视频com| 岛国大片免费在线观看| 成年女人18级毛片毛片免费观看| 久九九精品免费视频| 国产精品69白浆在线观看免费| 久九九精品免费视频| 最近中文字幕mv免费高清视频7 | 免费A级毛片无码A∨免费| 1000部拍拍拍18勿入免费视频软件 | 亚洲ⅴ国产v天堂a无码二区| 久久亚洲精品无码| 亚洲黄网在线观看| 亚洲午夜电影一区二区三区| 亚洲综合成人婷婷五月网址| 亚洲色一区二区三区四区| 成人婷婷网色偷偷亚洲男人的天堂| 国产成人亚洲综合在线| 国产黄色片免费看| 无码精品国产一区二区三区免费 | 18禁男女爽爽爽午夜网站免费| 国产日本一线在线观看免费| 岛国片在线免费观看| 亚洲成?Ⅴ人在线观看无码| 亚洲熟妇无码八AV在线播放| 亚洲网站在线观看| 亚洲成_人网站图片| 黄色三级三级免费看| 两个人看的www高清免费视频| 一级特黄aa毛片免费观看| 91视频国产免费| 亚洲A丁香五香天堂网| 亚洲爆乳无码一区二区三区| 亚洲人成7777影视在线观看| 色噜噜狠狠色综合免费视频| 国产精品网站在线观看免费传媒 | 足恋玩丝袜脚视频免费网站|