2017-年藍橋杯C-(A組)賽題-動態規劃-最大公共子串
分析:
動態規劃-空間換時間
暴力解法是以子串開端開始尋找
動態規劃法是利用相同子串的字元結尾。
設兩個字串分別為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然後就是部分試題的答案,有些轉載的
2017年A組藍橋杯(最大公共子串問題)【動態規劃】
最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"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年第九屆藍橋杯大學生A組C/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年藍橋杯B組C/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層,共有多少個煤