zoukankan      html  css  js  c++  java
  • 顺序对齐

    【问题描述】

    考虑两个字符串右对齐的最佳解法。例如,有一个右对齐方案中字符串是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;
    }
  • 相关阅读:
    Jenkins远程部署应用
    Centos7搭建Jenkins
    Centos7安装Docker
    Centos7安装Maven
    Centos7安装jdk
    由object元素引出的事件注册问题和层级显示问题
    ios中input输入无效
    手册
    CSS 清楚浮动总结
    JS 创建对象总结
  • 原文地址:https://www.cnblogs.com/harden/p/6730912.html
Copyright © 2011-2022 走看看