ZOJ1733 POJ1458 Common Subsequence,经典DP问题

来源:互联网 发布:验证码识别软件 编辑:程序博客网 时间:2024/06/06 03:56

很经典的DP问题,问最长共同子字符串。

DP[i][j]存放的是对于A字符串和B字符串,当A到达 i 和B到达j 时,最大公共字符串的长度。我们定义temp,如果A的第i个字符和B的第j个字符相等,则temp为1,否则为0。则对于DP[i][j],到达DP[i][j]的可能有三个,即从DP[i-1][j], DP[i-1][j-1], dp[i][j-1]到达。所以DP[i][j]=max(DP[i-1][j-1]+temp,DP[i][j-1],DP[i-1][j])。



/******************************************************************************* * Author : Neo Fung * Email : neosfung@gmail.com * Last modified : 2011-09-03 15:17 * Filename : ZOJ1733 POJ1458 Common Subsequence.cpp * Description :  * *****************************************************************************/// ZOJ1733 POJ1458 Common Subsequence.cpp : Defines the entry point for the console application.//// #include "stdafx.h"#include <string>#include <iostream>#include <fstream>#include <string.h>#define MAX 500using namespace std;int max3(const int &a,const int &b,const int &c){int temp=max(a,b);temp=max(temp,c);return temp;}int main(void){// ifstream cin("data.txt");string lhs,rhs;int dp[MAX][MAX];while(cin>>lhs>>rhs){memset(dp,0,sizeof(dp));for(int i=1;i<=lhs.length();++i){for(int j=1;j<=rhs.length();++j){int temp=(lhs.at(i-1)==rhs.at(j-1))?1:0;dp[i][j]=max3(dp[i-1][j-1]+temp,dp[i][j-1],dp[i-1][j]);}}cout<<dp[lhs.length()][rhs.length()]<<endl;}return 0;}


原创粉丝点击