顺序对齐

【问题描述】

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

AAD_DEFGGHC

ADCDE__GH_

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

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



【输入文件】

输入文件包含两行,每行一个字符串,最长50个字符。字符全部是大字字母。

【输出文件】

一行,为最佳对齐的得分。

【输入输出样例】

输入:AADDEFGGHCADCDEGH 

输出:
9

/*
    f[i][j]表示匹配到i,j时的最大价值。
    很明显,a[i]=b[j]时,f[i][j]=f[i-1][j-1]+2
    a[i]!=b[j]时,可以直接放在后面,也可以加空格,此时要枚举加空格的位置,以及向哪个字符串加空格。 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 110
using namespace std;
int n,m,f[N][N];
char a[N],b[N];
int main(){
    cin>>a>>b;
    n=strlen(a);m=strlen(b);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+2;
            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);
            f[i][j]=max(f[i][j],f[i-1][j-1]);
        }
    printf("%d",f[n][m]);
    return 0;
}
原文地址:https://www.cnblogs.com/harden/p/6730912.html