1. 程式人生 > >2017-年藍橋杯C-(A組)賽題-動態規劃-最大公共子串

2017-年藍橋杯C-(A組)賽題-動態規劃-最大公共子串

6. 標題:最大公共子串最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"abcdkkk" 和 "baabcdadabc",可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全劃線部分缺失的程式碼。#include <stdio.h>#include <string.h>#define N 256int f(const char* s1, const char* s2){       int a[N][N];       int len1 = strlen(s1);
       int len2 = strlen(s2);       int i,j;       memset(a,0,sizeof(int)*N*N);       int max = 0;       for(i=1; i<=len1; i++){              for(j=1; j<=len2; j++){                     if(s1[i-1]==s2[j-1]) {                            a[i][j] = __________________________;  //填空                            if(a[i][j] > max) max = a[i][j];
                     }              }       }       return max;}int main(){       printf("%d\n", f("abcdkkk", "baabcdadabc"));       return 0;}注意:只提交缺少的程式碼,不要提交已有的程式碼和符號。也不要提交說明性文字。

分析:

動態規劃-空間換時間

暴力解法是以子串開端開始尋找

動態規劃法是利用相同子串的字元結尾。

設兩個字串分別為s1、s2,s1[i]和s2[j]分別表示其第i和j個字元

再設a[i,j]表示以s1[i]和s2[j]結尾的子串的最大長度。

那麼s1,s2分別再向下走一個字元,我們可以推斷出a[i+1,j+1]與a[i,j]之間的關係,

如果s1[i] ==s2[j],那麼a[i+1,j+1] = a[i,j] + 1;否則a[i+1,j+1] =0。

a[i+1,j+1] = (s1[i] == B[j] ? a[i,j] + 1 : 0)

如果s1[i+1]和s2[j+1]相同,那麼就只要在以s1[i]和s2[j]結尾的最長相同子串之後分別添上這兩個字元即可,這樣就可以讓長度增加一位

綜上所述,就是a[i+1,j+1] = (s1[i+1] == s2[j+1] ? a[i,j] + 1 : 0)的關係

由上述關係,想到了使用二維陣列來儲存兩個字串之間的相同子串關係

因為a[i+1,j+1] = (s1[i+1] ==s2[j+1] ? a[i,j] + 1 : 0)關係,只計算二維資料的最上列和最左列數值即可,其他數值通過K[i+1,j+1] = (A[i+1] == B[j+1] ? K[i,j] + 1 : 0)可得。如下圖所示:

#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
       int a[N][N];
       int len1 = strlen(s1);
       int len2 = strlen(s2);
       int i,j;
       
       memset(a,0,sizeof(int)*N*N);
       int max = 0;
       for(i=1; i<=len1; i++){
              for(j=1; j<=len2; j++){
                     if(s1[i-1]==s2[j-1]) {
                            a[i][j] =a[i-1][j-1]+1;  //填空
                            if(a[i][j] > max) max = a[i][j];
                     }
              }
       }
       
       return max;
}
int main()
{
       printf("%d\n", f("abcdkkk", "baabcdadabc"));
       return 0;
}

相關推薦

2017-藍橋C-(A)-動態規劃-公共

6. 標題:最大公共子串最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"abcdkkk" 和 "baabcdadabc",可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情

2015-校內選拔-藍橋C-(A)-圓周率pai

(一道水水的題)歷史上有許多計算圓周率pai的公式,其中,格雷戈裡和萊布尼茨發現了下面的公式:pai = 4*(1-1/3+1/5-1/7 ....)參見【圖1.png】這個公式簡單而優美,但美中不足,它收斂的太慢了。如果我們四捨五入保留它的兩位小數,那麼:累積了1項和是:4

2017第八屆藍橋 C++A 第二 生命遊戲 題解

生命遊戲 康威生命遊戲是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。 這個遊戲在一個無限大的2D網格上進行。 初始時,每個小方格中居住著一個活著或死了的細胞。 下一時刻每個細胞的狀態都由它周圍八個格子的細胞狀態決定。 具體來說:

2017藍橋C++A題解集合

總結:藍橋杯的題目大多數都是暴利或者dfs、bfs解出來的,注意往這上面思考下面是賽題的連結:https://wenku.baidu.com/view/951dab772a160b4e767f5acfa1c7aa00b52a9d2d.html然後就是部分試題的答案,有些轉載的

2017A藍橋公共問題)【動態規劃

最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"abcdkkk" 和"baabcdadabc",可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分

第四屆藍橋C++A 顛倒的價牌

標題:顛倒的價牌小李的店裡專賣其它店中下架的樣品電視機,可稱為:樣品電視專賣店。其標價都是4位數字(即千元不等)。小李為了標價清晰、方便,使用了預製的類似數碼管的標價籤,只要用顏色筆塗數字就可以了(參見p1.jpg)。這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:

第八屆藍橋C++A 迷宮

標題:迷宮X星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。房間的地板上寫著一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。X星球的居民有點懶,

2017第八屆藍橋B第六公共

第六題 標題:最大公共子串 最大公共子串長度問題就是: 求兩個串的所有子串中能夠匹配上的最大長度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最長的公共子串是"a

藍橋java第八屆B公共

最大公共子串 最大公共子串長度問題就是: 求兩個串的所有子串中能夠匹配上的最大長度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。 下面的程式是採用矩陣法進行求解的,這對串的規模不大的情

標題 公共 -藍橋

標題:最大公共子串最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"abcdkkk" 和 "baabcdadabc",可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是

C程式設計——程式設計實現查詢兩個字串的公共2.0

1、 題目:程式設計實現查詢兩個字串的最大公共子串 示例:“aocdfe"和"pmcdfa"最大公共子串為"cdf” 注:最大公共子串有不止一個時,只輸出第一個最大子串 利用斐波那契數列數的思想 **2、**程式 #include <stdio.h> #include &

C程式設計——程式設計實現查詢兩個字串的公共1.0

1、 題目:程式設計實現查詢兩個字串的最大公共子串 示例:“aocdfe"和"pmcdfa"最大公共子串為"cdf” 注:最大公共子串有不止一個時,只輸出第一個最大子串 **2、**程式 #include <stdio.h> #include <string.h>

2017藍橋C/C++ A

題目轉載至:https://wenku.baidu.com/view/951dab772a160b4e767f5acfa1c7aa00b52a9d2d.html本題解不一定全對,歡迎指出錯誤。第一題1.標題:迷宮X星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通

2016藍橋C語言大學A題目1--網友年齡 暴力

  網友年齡 某君新認識一網友。 當問及年齡時,他的網友說: “我的年齡是個2位數,我比兒子大27歲, 如果把我的年齡的兩位數字交換位置,剛好就是我兒子的年齡” 請你計算:網友的年齡一共有多少種可能情況? 提示:30歲就是其中一種可能哦. 請填寫表示可能情況的種數。 注

2017藍橋A(包子湊數)

小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買X個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5

2018第九屆藍橋大學生AC/C++第十

描述一下自己:自己沒控制好時間 ,沒有提前練習;問題描述:n個人吃飯,總共花費m錢數,n個人分別帶a0,a1,....錢,計算怎麼出錢使得這n個人出的錢的方差最小。輸出方差即可。輸入: 10 30 2 1 3 4 5 6 7 8 9 10 輸出: 0.7928忘了輸入輸出的格

2017藍橋C++B

個人理解,僅供參考,歡迎討論 (5) 標題:對局匹配 小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。 小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他

2017藍橋A解析

1.迷宮 X星球的一處迷宮遊樂場建在某個小山坡上。 它是由10x10相互連通的小房間組成的。 房間的地板上寫著一個很大的字母。 我們假設玩家是面朝上坡的方向站立,則: L表示走到左邊的房間, R

2017藍橋BC/C++決賽題目

info http 強迫癥 網站 正方 尋找 管理員 藍橋 一起 2017年第八屆藍橋杯B組C/C++決賽題目 ? ? 1.36進制 對於16進制,我們使用字母A-F來表示10及以上的數字。 如法炮制,一直用到字母Z,就可以表示36進制。 36進制中,A表示10,Z表示3

第七屆藍橋C/C++B及答案

part 實現 void 整數 三層 在一起 idt mage 算法; 第一題 【題目】 煤球數目 有一堆煤球,堆成三角棱錐形。具體:第一層放1個,第二層3個(排列成三角形),第三層6個(排列成三角形),第四層10個(排列成三角形),....如果一共有100層,共有多少個煤