131. Align Strings

题目

描述

现在有两个字符串,可以在字符串的任意位置(开头,中间,末尾)插入任意数量的空格.
在插入适当数量的空格后,将两个字符串右对齐,通过一定的规则获得一个匹配值X,你的任务是寻找一种方案,使得匹配值X最大.
匹配值的计算规则是:
1.对每一个匹配的位置(对应位置字符相同),X+=2;
2.对每一段连续的空格,X-=1;
也即匹配值X是匹配位置的2倍减去连续空格的段数.
注意并不处罚左边的不匹配位置.

输入

每个输入样例包括两行,每行包含一个字符串,最长500个字符.每个字符串保证只包含大写英文字母.

输出

每个样例的输出仅包含一个整数,表示最大的匹配值X.

输入样例
AADDEFGGHC
ADCDEGH
输出样例
9

思路分析

f[i][j]表示取第一行前i个和第二行前j个字符,匹配值X的最大值。DP问题。

【我的代码】

#include <stdio.h>
#include <string.h>
#define N 501    
#define max(a, b) ((a) > (b) ? (a) : (b))
int f[N][N];
int main()
{
    char s1[N], s2[N];
    gets(s1);
    gets(s2);
    for (int i = 1; i <= strlen(s1) ; ++i) {
        for (int j = 1; j <= strlen(s2) ; ++j)
        {
            if(s1[i-1] == s2[j-1]) f[i][j] = f[i-1][j-1] + 2; //如果匹配,对于f(i-1,j-1)+2分肯定是最好
            else    
            {
                for (int k = 1; k < i; ++k)
                    f[i][j] = max(f[k][j] - 1, f[i][j]);
                for (int k = 1; k < j; ++k)
                    f[i][j] = max(f[i][k] - 1, f[i][j]);
                f[i][j] = max(f[i-1][j-1], f[i][j]);
            }
        }
    }
    for (int i = 1; i <= strlen(s1) ; ++i) {
        for (int j = 1; j <= strlen(s2) ; ++j)
        {
            printf("%d", f[i][j]);
        }
        printf("\n");
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,777评论 0 5
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,745评论 0 4
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,146评论 0 2
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,974评论 0 3
  • App Store 审核指南 iOS Xcode 最新构建版本缺少合规证明
    4164fccdcf1c阅读 159评论 0 0

友情链接更多精彩内容