HAOI2010 最長上公升子串行長度

2021-07-02 12:10:24 字數 1719 閱讀 1573

/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******

題目描述

字串行的子串行是指從給定字串行中隨意地(不一定連續)去掉若干個字元(可能乙個也不去掉)後所形成的字串行。令給定的字串行x=「x0,x1,…,xn-1」, 序列y=「y0,y1,…,yk-1是x的子串行,存在x的乙個嚴格遞增下標序列

,使得對所有的j=0,1,…,k- 1,有xij="yj。 例如,x=「abcbdab」,y=「bcdb」是x的乙個子串行。對給定的兩個字串行,求出他們最長的公共子串行長度,以及最長公共子串行個數。i0,i1,…,ik-1>

,使得對所有的j=0,1,…,k->

輸入第1行為第1個字串行,都是大寫字母組成,以」.」結束。長度小於5000。

第2行為第2個字串行,都是大寫字母組成,以」.」結束,長度小於5000。

輸出第1行輸出上述兩個最長公共子串行的長度。

第2行輸出所有可能出現的最長公共子串行個數,答案可能很大,只要將答案對100,000,000求餘即可。

思路這是一道典型的求最長公共子串行的題,但不只是基礎。

首先第一問很容易得到解決;第二問只需要再加乙個陣列進行計數即可。如果需要更新f陣列時,單純得給s陣列賦值即可;若最長長度相等,則只需在之前滿足條件的最大值上加上s陣列即可。最後再利用迴圈計數相加取模即可。

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

****/

#include

#include

#include

#define inf 100000000

using namespace std;

int n,m,maxl,count,s[5002],ans,f[5002];

string a,b;

int main()

else}}

if(maxl

else}}

}ans=0;

count=0;

for(int i=1;i

else}}

cout}/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******

problem: 22852

user: hznq60003

language: c++

result: 正確

time:527 ms

memory:1720 kb

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

****/

HAOI2010 最長公共子串行 dp

求兩個字串行的最長公共子串行以及個數,n leq 5000 第一問,考慮 f i j 表示兩個串分別跑到了 i,j 位置的最長公共子串行,則 f i j max f i 1 j f i j 1 f i 1 j 1 s i t j 暴力轉移即可 第二問,考慮 g i j 表示兩個串分別跑到了 i,j ...

最長上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

最長上公升子串行

最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...