uva10723 类似LCS的dp dayly

来源:互联网 发布:mysql 全文索引 中文 编辑:程序博客网 时间:2024/06/15 21:12

转自:http://blog.csdn.net/helloworld10086/article/details/43916135

这道题自己没有细想,连求最短的串的长度都没想。。。有点浪费了这道题,,

关于求 方案的个数,,我觉得应该大概都是这种的。。




#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 40;char str1[N],str2[N];int l[N][N],dp[N][N];int main() {    int T ,cas = 1;    scanf("%d", &T); getchar();    while(T--) {        gets(str1);gets(str2);        int len1 = strlen(str1), len2 = strlen(str2);        memset(dp,0,sizeof(dp));        memset(l,0,sizeof(l));        for(int i = 1; i < N; i++) {            l[i][0] = l[0][i] = i;            dp[i][0] = dp[0][i] = 1;        }        dp[0][0] = 1;        for(int i = 1; i <= len1; i++) {            for(int j = 1; j <= len2; j++) {                if(str1[i-1] == str2[j-1]) {                    l[i][j] = l[i-1][j-1] + 1;                }else {                    l[i][j] = min(l[i-1][j],l[i][j-1]) + 1;                }            }        }        for(int i=1;i<=len1;++i){            for(int j=1;j<=len2;++j){                if(str1[i-1]==str2[j-1]){                    dp[i][j] = dp[i-1][j-1];                }else {                    if(l[i-1][j] < l[i][j-1]) {                        dp[i][j] = dp[i-1][j];                    }else if(l[i-1][j] > l[i][j-1]) {                        dp[i][j] = dp[i][j-1];                    }else {                        dp[i][j] = (dp[i-1][j] + dp[i][j-1]);                    }                }            }        }        printf("Case #%d: %d %d\n",cas++,l[len1][len2],dp[len1][len2]);    }    return 0;}

0 0