隨筆-28  評(píng)論-51  文章-10  trackbacks-0
          動(dòng)態(tài)規(guī)劃的經(jīng)典應(yīng)用,其實(shí)現(xiàn)在發(fā)現(xiàn),其實(shí)質(zhì)就是利用矩陣或者數(shù)組保存歷史結(jié)果,而不用每次遞歸求解
          關(guān)鍵點(diǎn):
          1.找出問題的遞歸表達(dá)式
          2.然后根據(jù)表達(dá)式,直接轉(zhuǎn)化為矩陣上的數(shù)據(jù)運(yùn)算

          本問題的遞歸表達(dá)式為:
          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實(shí)現(xiàn)
           1 #include <stdio.h>
           2 #include <stdlib.h>
           3 #define MAXSIZE 10
           4 static char * LCSarray;
           5 static char *start; //指向LCSarray數(shù)組中最長(zhǎng)公共字串的開始位置
           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);//保存最長(zhǎng)公共字串的數(shù)組容器
          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代表行下標(biāo)j代表列下標(biāo)
          25     int t = 0//保存最長(zhǎng)公共字串的下標(biāo)
          26     
          27     //以下構(gòu)建矩陣
          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     //找出一個(gè)最大公共字串(一開始還以為是條捷徑呢,原來(lái)是謬誤,
          55     //因?yàn)橹豢紤]最后一列比較,你不能確定較大值必定包含在全局的最大公共子序列中)
          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尾部縱向優(yōu)先搜索,碰到兩個(gè)不同值時(shí)保存char,一直到第一行(其實(shí)最合理的應(yīng)該最后搜索到matrix[1][1]節(jié)點(diǎn))*/
          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     //矩陣最后一個(gè)元素即是我們所需的最長(zhǎng)公共子序列的個(gè)數(shù)
          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 閱讀(2510) 評(píng)論(1)  編輯  收藏 所屬分類: 算法

          評(píng)論:
          # re: 最長(zhǎng)公共子序列問題-c實(shí)現(xiàn) 2008-10-01 17:48 | anont
          非常感謝  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 荔波县| 朔州市| 和平区| 高平市| 连平县| 岢岚县| 安陆市| 邹平县| 安多县| 璧山县| 改则县| 上林县| 兴仁县| 舒城县| 娄烦县| 宝鸡市| 定南县| 页游| 越西县| 武城县| 乃东县| 抚顺市| 凤冈县| 涞源县| 那坡县| 江孜县| 娄烦县| 嘉善县| 济南市| 衡山县| 大余县| 桃江县| 新安县| 贵溪市| 滨海县| 西城区| 合川市| 遂昌县| 龙江县| 阜新| 台安县|