給出兩個字符串s,t,讓找出最長的k個在s,t不相交的公共子串。c++
看了好幾個題解才搞懂。spa
代碼中有註釋code
#include<bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; const int N=1e5+10; const int mod=1e9+7; const int inf=0x3f3f3f3f; char s[N],t[N],k; int dp[1010][1010][11][2]; /* 終於搞明白了 dp[i][j][k][0]表示的是s的前i個字符,t的前j個字符,選擇k個公共子串的最大值(不必定包括i,j) dp[i][j][k][1]表示的是s的前i個字符,t的前j個字符,選擇k個公共子串最後是i,j的最大值 dp[lens][lent][k][0]就是題目要求的答案。 當s[i]==t[j]的時候dp[i][j][k][1]才存在(不爲0) */ int main() { int lens,lent; scanf("%d%d%d%s%s",&lens,&lent,&k,s+1,t+1); for(int i=1; i<=lens; i++) { for(int j=1; j<=lent; j++) { for(int l=1; l<=k; l++) { if(s[i]==t[j])//只有s[i]==t[j]的時候纔有dp[i][j][l][1] dp[i][j][l][1]=max(dp[i-1][j-1][l][1]+1,dp[i-1][j-1][l-1][0]+1); /*能夠沿用以前的第l個公共子串,或者讓i,j做爲第l個子串的第一位*/ dp[i][j][l][0]=max(dp[i-1][j][l][0],max(dp[i][j-1][l][0],dp[i][j][l][1])); } } } printf("%d\n",dp[lens][lent][k][0]); return 0; } /* */