zoj 1733 || hdu 1159 Common Subsequence(Easy , classics DP)

来源:互联网 发布:论文查重率用什么软件 编辑:程序博客网 时间:2024/05/27 00:24

经典水DP,求最长公共子串。

以前写过,不过忘记了 = =。。

重来。

开始想繁了,写了个O(N^4)的,果断TLE了。因为记录的是a串以i为结尾b串以j为结尾的最大长度。

后来想了想,直接记录以a串第i个位置之前,b串j之前的最大长度。

如果a[i] == b[j] 那么a[i-1][j-1] 的长度肯定要加1,然后再找dp[i-1][k],dp[i][k-1]最大值即可。

看了我以前的代码= =。。。不用加那么多预处理,直接串从1开始就好了,我这个串是从0开始的,加了些预处理防止越界。

#include <queue>#include <stack>#include <math.h>#include <time.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <string>#include <algorithm>#define MID(x,y) ( ( x + y ) >> 1 )#define L(x) ( x << 1 )#define R(x) ( x << 1 | 1 )#define BUG puts("here!!!")using namespace std;const int MAX = 1050;char a[MAX],b[MAX];int dp[MAX][MAX];int main(){while( ~scanf("%s%s",a,b) ){memset(dp,0,sizeof(dp));int n = strlen(a);int m = strlen(b);for(int i=0; i<m; i++){if( a[0] == b[i] )dp[0][i] = 1;elsedp[0][i] = ( i == 0 ? 0 : dp[0][i-1] );}for(int i=0; i<n; i++)if( a[i] == b[0] )dp[i][0] = 1;elsedp[i][0] = ( i == 0 ? 0 : dp[i-1][0] );for(int i=1; i<n; i++)for(int k=1; k<m; k++)if( a[i] == b[k] )dp[i][k] = max(dp[i-1][k-1]+1, max(dp[i][k-1], dp[i-1][k]));elsedp[i][k] = max(dp[i][k-1], dp[i-1][k]);int ans = dp[n-1][m-1];printf("%d\n",ans);}return 0;}


原创粉丝点击