顺序对齐
【问题描述】
考虑两个字符串右对齐的最佳解法。例如,有一个右对齐方案中字符串是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; }