1730 - 顺序对齐

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

考虑两个字符串右对齐的最佳解法。例如,有一个右对齐方案中字符串是AADDEFGGHCADCDEGH

AAD_DEFGGHC

 ADCDE__GH_

每一个数值匹配的位置值2分,一段连续的空格值-1分。所以总分是匹配点的2倍减去连续空格的段数,在上述给定的例子中,6个位置(A,D,D,E,G,H)匹配,三段空格,所以得分2*6+(-1)*3=9,注意,我们并不处罚左边的不匹配位置。若匹配的位置是两个不同的字符,则既不得分也不失分。

请你写个程序找出最佳右对齐方案。

题目输入

每笔测资包含两行,每行一个字符串,最长50个字符。字符全部是大字字母。

题目输出

每笔测资输出一行,为最佳对齐得分。

输入/输出样例

输入格式

AADDEFGGHC
ADCDEGH

输出格式

9

C++解答

#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
const int N(55);
int f[N][N]={0};

int main()
{
    string s1,s2;
    int i,j,len1,len2;
    while (cin>>s1>>s2)
    {    
        memset(f,0,sizeof(f));       
        len1=s1.size();  len2=s2.size();
        for (i=1;i<=len1;i++)
            for (int  j=1;j<=len2;j++)
            {                 
                f[i][j]=f[i-1][j-1]+(s1[i-1]==s2[j-1]?2:0); 
                for (int k=1;k<i;k++) f[i][j]=max(f[i][j],f[k][j]-1);
                for (int k=1;k<j;k++) f[i][j]=max(f[i][j],f[i][k]-1);
            }
        cout<<f[len1][len2]<<endl;
    }
    return 0;
}