2423 HAOI2010 最長公共子串行

2021-08-07 17:11:21 字數 1031 閱讀 1921

題目大意:

都是中文自己看吧,題目鏈結

題解:對於第一問,f[i][j]表示第一串到i第二串到j的最長公共子串,

f[i][j]=f[i-1][j-1](a[i]==b[j]),f[i][j]=max(f[i-1][j],f[i][j-1])(a[i]!=b[j])

對於第二問,g[i][j]表示第一串到i第二串到j的方案數,

第一種情況(a[i]==b[j])

如果f[i][j]==f[i][j-1] g[i][j]+=g[i][j-1],如果f[i][j]==f[i-1][j] g[i][j]+=g[i-1][j]

不會有重複的情況,f[i

−1][

j−1]

不可能去更新f[

i−1]

[j],

f[i]

[j−1

]

,所以新產生的路徑一定與之前的沒有交集。

第二種情況(a[i]!=b[j])

如果f[i][j]==f[i][j-1] g[i][j]+=g[i][j-1],如果f[i][j]==f[i-1][j] g[i][j]+=g[i-1][j] 

最後還要減去 如果f[i][j]==f[i-1][j-1] g[i][j]-=g[i-1][j-1]

為什麼,想想就懂了吧。。。

#include#include#include#include#includeusing namespace std;

#define mod 100000000

const int n=5110;

char s1[n],s2[n];

int n,m;

int f[2][n],g[2][n];

int main()

else

g[mar][j]%=mod;

} }g[mar][m]+=mod;g[mar][m]%=mod;

printf("%d\n%d",f[mar][m],g[mar][m]);

}

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 ...

bzoj 2423 最長公共子串行

題意 中文題意,略。思路 第一問,求最長公子序列,模板題。第二問,求最長公共子串行的個數,這個就比較有意思了。設len i j 表示表示第乙個串到i位置,第二個串到j位置時的長度。設lcs i j 表示第乙個串到i位置,第二個串到j位置時,lcs的個數。當a i b j 那麼最長公共子串行肯定是可以...

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 的最長上...