BZOJ2423 最長公共子串行(動態規劃)

2022-03-20 04:34:24 字數 892 閱讀 5688

bzoj

洛谷今天考試的時候,神仙出題人\(fdf\)把這道題目作為乙個二合一出了出來,我除了orz還是只會orz。

對於如何\(o(n^2)\)求解最長的長度是很簡單的。

設\(f[i][j]\)表示第乙個串匹配到了\(i\),第二個串匹配到了\(j\)的最大長度。

那麼轉移很顯然,要麼\(i\)向後挪動一位,要麼\(j\)向後挪動一位,要麼\(i,j\)匹配上了。

也就是\(f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+1)\),最後乙個轉移當且僅當\(x[i]=y[j]\)時才有。

考慮如何統計方案。顯然是再記錄乙個陣列\(g[i][j]\)表示到了\(f[i][j]\)時最長長度的方案數。

每次轉移的時候如果長度一樣則相加。

但是注意乙個問題,當轉移的時候,發現\(f[i-1][j],f[i][j-1],f[i-1][j-1]\)三者轉移是相同的時候,

如果直接統計和的話,那麼\(f[i-1][j-1]\)的方案會被重複計算兩次,因此需要額外減去。

#include#include#includeusing namespace std;

#define mod 100000000

#define ll long long

#define max 5005

void add(int &x,int y)

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

int ans=0,sum=0;

char s[max],w[max];

int main()

} printf("%d\n%d\n",f[n&1][m],g[n&1][m]);

return 0;

}

bzoj 2423 最長公共子串行

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

2423 HAOI2010 最長公共子串行

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

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...