洛谷P2516 HAOI2010 最長公共子串行

2022-05-08 05:45:11 字數 1066 閱讀 9569

字串行的子串行是指從給定字串行中隨意地(不一定連續)去掉若干個字元(可能乙個也不去掉)後所形成的字串行。令給定的字串行x=「x0,x1,…,xm-1」,序列y=「y0,y1,…,yk-1」是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j=0,1,…,k-1,有xij = yj。例如,x=「abcbdab」,y=「bcdb」是x的乙個子串行。對給定的兩個字串行,求出他們最長的公共子串行長度,以及最長公共子串行個數。

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

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

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

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

輸入 #1複製

abcbdab.

bacbbd.

輸出 #1複製

4

7分析:1、最長公共子串行,套用o(n2)dp

2、分情況討論:設num[i][j]為第i,j位的最長公共子串行的個數;當末尾兩位相同時,轉移到num[i - 1][j - 1];其他情況見**;

注意1:num[i - 1][j]和num[i][j - 1]在dp[i][j] = dp[i - 1][j - 1]的情況下會有重疊的部分,需要減去該部分。

注意2:要用滾動陣列,不然空間裝不下。

**:

1 #include 2

using

namespace

std;

3const

int mod =1e8;

4const

int maxn = 5010;5

long

long dp[2

][maxn];

6long

long num[2

][maxn];78

intmain()

928 cout << dp[k][lenb] << endl << num[k][lenb] <29 }

P2516 HAOI2010 最長公共子串行

題目鏈結 匹配dp。最長公共子串行比較好求 if a i b j f i j max f i j f i 1 j 1 1 else f i j max f i j max f i 1 j f i j 1 那最長公共子串行的個數怎麼求呢?我們用 g i j 表示a串匹配到 i b串匹配到 j 的最長上...

洛谷 P2517 HAOI2010 訂貨

給出每乙個月的商品需求量和每乙個月的生產成本以及倉庫容量和貯存費用 每月,與貯存貨物的量無關 問最小成本.一開始沒有想到用費用流去做,且難以建圖,但將名詞轉化一下即可 將貨物的量當做流量,成本當做費用,先建乙個超級源點 可以理解為工廠 連向每乙個月的節點,因為生產數量無限制,故流量為inf,費用為成...

洛谷P2515 HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...