簡單dp -- Common Subsequence POJ - 1458

多行不譯必自閉發表於2020-10-22

Common Subsequence POJ - 1458

題意:
給你s, t兩個字串,求出兩個字串的最長公共子串,子串的原串字元按原串順序組成的。

思路:
dp[i][j]記錄s串第i個字元匹配到t串第j個字元的最長公共子串長度,把s串的字元與t串的字元挨個比較,若s[i] == t[j], 則此時匹配的最長字串為dp[i][j] = dp[i - 1][j - 1] + 1,否則dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])。

code:




#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e3 + 5;
char s[maxn], t[maxn];
int dp[maxn][maxn];

void init(){
	memset(dp, 0, sizeof(dp));
}

int main(){
	while(cin >> s + 1 >> t + 1){  
	
	   init();

	   int len1 = strlen(s + 1);
	   int len2 = strlen(t + 1);
	   for(int i = 1; i <= len1; i++)
	      for(int j = 1; j <= len2; j++)
	         if(s[i] == t[j]) dp[i][j] =  dp[i - 1][j - 1] + 1;
	         else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
	   
	   
	       
		cout << dp[len1][len2] << endl; 
		
	}
} 

相關文章