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

    http://zsyz.openjudge.cn/dp/18/
    总时间限制: 
    1000ms
     
    内存限制: 
    102400kB
    描述

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

    AAD_DEFGGHC          

    ADCDE__GH_          

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

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

    输入
    输入文件包含两行,每行一个字符串,最长50个字符。字符全部是大字字母。
    输出
    一行,为最佳对齐的得分。
    样例输入
    AADDEFGGHC
    ADCDEGH
    
    样例输出
    9

    f[i][j] 表示匹配到第一个串前i个,第二个串前j个的最大得分
    有4中决策:
    匹配 f[i][j]=f[i-1][j-1]+2
    第一个串位置i加空格: f[i][j]=max(f[i][j],f[k][j]-1) 1<k<i
    第二个串位置j加空格: f[i][j]=max(f[i][j],f[i][k]-1) 1<k<j
    不匹配但不空格 f[i][j]=max(f[i][j],f[i-1][j-1])

    题目中不处罚左边不匹配位置,
    若左边都不匹配,如果处罚,f为负数
    但因为初始值为0,取大还是0,相当于不处罚
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char a[51],b[51];
    int  f[51][51],l1,l2;
    int main()
    {
        scanf("%s%s",a+1,b+1);
        l1=strlen(a+1); l2=strlen(b+1);
        for(int i=1;i<=l1;i++)
         for(int j=1;j<=l2;j++)
          {
               if(a[i]==b[j]) 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[l1][l2]);
    }
     
  • 相关阅读:
    前端有未来吗?
    谈技术人员思维转变
    程序员职场背锅甩锅指南
    9 个非常实用的网络调试命令,你会用几个呢?
    nginx获取客户端请求的真实IP
    10个VSCode高效开发插件
    作为一个技术Leader,要如何去提升团队的技术氛围
    前端程序员要懂的 UI 设计知识
    【云速建站】如何实现多用户权限管理
    补习系列(10)-springboot 之配置读取
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6752910.html
Copyright © 2011-2022 走看看