• 顺序对齐


    【问题描述】

    考虑两个字符串右对齐的最佳解法。例如,有一个右对齐方案中字符串是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;
    }
  • 相关阅读:
    js去除字符串空格(空白符)
    jq以固定开头的class属性的名称
    day--38 mysql表的完整性约束总结
    day--39-MySQL的多表查询
    day--40 mysql-视图,触发器,存储过程,函数总结
    day--41 mysql索引原理与慢查询优化
    day--42 前端基础小结
    day--43 HTML标签和CSS基本小结
    day46----JavaScript的函数及对象小结
    JavaScript正则表达式
  • 原文地址:https://www.cnblogs.com/harden/p/6730912.html
Copyright © 2020-2023  润新知