題目大意:
都是中文自己看吧,題目鏈結
題解:對於第一問,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 的最長上...