CSU 1060 Nearest Sequence

來源:互聯網
上載者:User

標籤:

題意:求三個序列的最長公用子序列。

思路:一開始以為只要求出前兩個的LCS,然後和第三個再求一遍LCS就是答案了。但是範例就對我進行啪啪啪打臉了。實際上就跟兩個序列的差不多,換成三維的就行了。

代碼:需要注意的是max速度比較慢,最後改成if

 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 const int N=111; 6 int dp[N][N][N]; 7 char a[N],b[N],c[N]; 8 void LCS() 9 {10     int la=strlen(a),lb=strlen(b),lc=strlen(c),i,j,k;11     memset(dp,0,sizeof(dp));12     for(i=1;i<=la;i++)13     {14         for(j=1;j<=lb;j++)15         {16             for(k=1;k<=lc;k++)17             {18                 if(a[i-1]==b[j-1]&&a[i-1]==c[k-1])19                     dp[i][j][k]=dp[i-1][j-1][k-1]+1;20                 else21                 {22                     if(dp[i-1][j][k]>dp[i][j][k])    dp[i][j][k]=dp[i-1][j][k];23                     if(dp[i-1][j-1][k]>dp[i][j][k])    dp[i][j][k]=dp[i-1][j-1][k];24                     if(dp[i-1][j][k-1]>dp[i][j][k])    dp[i][j][k]=dp[i-1][j][k-1];25                     if(dp[i][j-1][k]>dp[i][j][k])    dp[i][j][k]=dp[i][j-1][k];26                     if(dp[i][j-1][k-1]>dp[i][j][k])    dp[i][j][k]=dp[i][j-1][k-1];27                     if(dp[i][j][k-1]>dp[i][j][k])    dp[i][j][k]=dp[i][j][k-1];28                 }29             }30         }31     }32 }33 int main()34 {35     while(scanf("%s%s%s",a,b,c)!=EOF)36     {37         LCS();38         printf("%d\n",dp[strlen(a)][strlen(b)][strlen(c)]);39     }40     return 0;41 }

 

CSU 1060 Nearest Sequence

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.