131. Align Strings

题目

描述

现在有两个字符串,可以在字符串的任意位置(开头,中间,末尾)插入任意数量的空格.
在插入适当数量的空格后,将两个字符串右对齐,通过一定的规则获得一个匹配值X,你的任务是寻找一种方案,使得匹配值X最大.
匹配值的计算规则是:
1.对每一个匹配的位置(对应位置字符相同),X+=2;
2.对每一段连续的空格,X-=1;
也即匹配值X是匹配位置的2倍减去连续空格的段数.
注意并不处罚左边的不匹配位置.

输入

每个输入样例包括两行,每行包含一个字符串,最长500个字符.每个字符串保证只包含大写英文字母.

输出

每个样例的输出仅包含一个整数,表示最大的匹配值X.

输入样例
AADDEFGGHC
ADCDEGH
输出样例
9

思路分析

f[i][j]表示取第一行前i个和第二行前j个字符,匹配值X的最大值。DP问题。

【我的代码】

#include 
#include 
#define N 501    
#define max(a, b) ((a) > (b) ? (a) : (b))
int f[N][N];
int main()
{
    char s1[N], s2[N];
    gets(s1);
    gets(s2);
    for (int i = 1; i <= strlen(s1) ; ++i) {
        for (int j = 1; j <= strlen(s2) ; ++j)
        {
            if(s1[i-1] == s2[j-1]) f[i][j] = f[i-1][j-1] + 2; //如果匹配,对于f(i-1,j-1)+2分肯定是最好
            else    
            {
                for (int k = 1; k < i; ++k)
                    f[i][j] = max(f[k][j] - 1, f[i][j]);
                for (int k = 1; k < j; ++k)
                    f[i][j] = max(f[i][k] - 1, f[i][j]);
                f[i][j] = max(f[i-1][j-1], f[i][j]);
            }
        }
    }
    for (int i = 1; i <= strlen(s1) ; ++i) {
        for (int j = 1; j <= strlen(s2) ; ++j)
        {
            printf("%d", f[i][j]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(131. Align Strings)