标签:memset str rect 数组 problem comm script nta esc
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
题目大意:
给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致。
解题思路:
用一个数组dp[i][j] 存 到s1的第i位为止 s2的前j位中有dp[i][j]个字符的先后顺序和原串中的先后顺序一致。
状态转移方程为:
如果s1[i]和s2[j]相等 则 dp[i+1][j+1]=dp[i][j]+1
否则 dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1])
结果输出dp[len(s1)][len(s2)]即可。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1010; char s1[N],s2[N]; int dp[N][N]; int main() { while(~scanf("%s%s",s1,s2)) { int len1=strlen(s1),len2=strlen(s2); memset(dp,0,sizeof(dp)); for (int i=0; i<len1; i++) for (int j=0; j<len2; j++) { if (s1[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1; else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]); } printf("%d\n",dp[len1][len2]); } return 0; }
POJ 1458 Common Subsequence (动态规划)
标签:memset str rect 数组 problem comm script nta esc
原文地址:https://www.cnblogs.com/l999q/p/9363319.html