题目大意

两个字符串strA和strB(长度最大为2100),他们中按照顺序有一些公共的子串,且公共子串的长度大于等于3,否则不认为是合法的,比如 abcdef 和 abcxcdef, 按照顺序有合法公共子串abc def 或者 cdef。 
    按照顺序取出一些公共子串,有不同的取法,求这些取法中公共子串长度之和的最大值。

题目分析

字符串长度最大为2100,因此直接枚举搜索会超时,考虑使用动态规划,且复杂度要降到 O(n^3) 甚至 O(n^2). 用状态 dp[i][j][0] 表示strA 前i个字符和strB 前j个字符中满足合法条件的公共子串的长度之和; dp[i][j][1] 表示strA 前i个字符和strB 前j个字符的公共后缀的长度。

状态 dp[i][j][1] 很好找到状态转移方程,而对于 dp[i][j][0]: 
(1)如果 strA[i-1] == strB[j-1],可以根据 dp[i][j][1] 来看,如果 dp[i][j][1] 大于等于3,即为len,则dp[i][j][0]可以根据 dp[i-k][j-k][0]来进行更新(其中k >= 3, k <= len)。因为 在选择最后一个子串的时候,可以选择长度为3,4...len。

(2)如果 strA[i-1] != strB[j-1],则 dp[i][j][0] = max{dp[i][j-1][0], dp[i-1][j][0]}

实现

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
using namespace std; int dp[2200][2200][2];
//dp[i][j][0] 表示 strA 前i个字符和strB前j个字符中满足条件的公共子串的长度之和
//dp[i][j][1] 表示 strA 前i个字符和strB前j个字符的公共后缀的长度
char strA[2200];
char strB[2200];
int max(int a, int b){
return a > b ? a : b;
}
int main(){
scanf("%s", strA);
scanf("%s", strB);
int m = strlen(strA);
int n = strlen(strB);
memset(dp, 0, sizeof(dp)); for (int i = 1; i <= m; i++){
for (int j = 1; j <= n; j++){
dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j - 1][0]);
if (strA[i - 1] == strB[j - 1]){
dp[i][j][1] = dp[i - 1][j - 1][1] + 1;
if (dp[i][j][1] >= 3){
dp[i][j][0] = max(dp[i][j][0], dp[i - 3][j - 3][0] + 3);
dp[i][j][0] = max(dp[i][j][0], dp[i - dp[i][j][1]][j - dp[i][j][1]][0] + dp[i][j][1]);
}
/*
if (dp[i][j][1] >= 3){ //当以 strA以i结尾,strB 以j结尾的后缀长度dp[i][j][1]大于等于3,则需要进行状态更新
//不能直接 dp[i][j][0] = max(dp[i][j][0], dp[i - dp[i][j][1]][j - dp[i][j][1]][0] + dp[i][j][1]);
//这样有可能不是最优解,例如 abcdef, abcxcdef. 最后的 dp[i][j][1] = 4, 如果计算dp[6][7][0]的时候使用dp[i][j][1] = 4
//进行状态转移,那么只计算 dp[6][7][0] = max(dp[6][7][0], dp[2][3][0] + 4) 而dp[2][3][0] = 0,
//而此时的最优结果为 dp[3][4][0] + 3 (dp[i][j][1] 中只取后面的一部分就够了)
for (int k = 3; k <= dp[i][j][1]; k ++)
dp[i][j][0] = max(dp[i][j][0], dp[i - k][j - k][0] + k);
}
*/
}
}
}
printf("%d\n", dp[m][n][0]);
return 0;
}

hiho_1059_string matching content length的更多相关文章

  1. String Matching Content Length

    hihocoder #1059 :String Matching Content Length 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 We define the ...

  2. Hihocoder 1059 String Matching Content Length

    预处理下连续相等的字符个数其实主要是看是否满3个 后面递推的时候特判下+1上次递推[i-1,j-1]不是来自[i-2,j-1]也不是来自[i-1,j-2]其实就是只来自[i-4,j-4]+3,和[i- ...

  3. WCF常见异常-The maximum string content length quota (8192) has been exceeded while reading XML data

    异常信息:The maximum string content length quota (8192) has been exceeded while reading XML data 问题:调用第三 ...

  4. The maximum string content length quota (8192) has been exceeded while reading XML data

    原文:The maximum string content length quota (8192) has been exceeded while reading XML data 问题场景:在我们W ...

  5. 定时器setInterval, innerText获取文本, charAt()获取单个字符串, substring(1, content.length)获取范围内的字符串, 实现字符串的滚动效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. ics httpDELETE 时增加 content,length 特别需求

    unit: OverbyteIcsHttpProt.pasprocedure THttpCli.SendRequest(const Method, Version: String); var Head ...

  7. 调用WebServiceWebService提示The maximum string content length quota (8192) has been exceeded while reading XML data的解决办法

    在web.config中,bindings节点下,对应的服务名称中,原本可能是自动折叠的“/>”,需要改成手动折叠的</binding>,然后在中间加上<readerQuota ...

  8. nutch-1.7-二次开发-Content中增加编码

    1 识别nutch-1.7的编码,完成 以前1.2是在 org.apache.nutch.parse.html.HtmlParser EncodingDetector detector = new E ...

  9. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

随机推荐

  1. uva 10673 Play with Floor and Ceil

    Problem APlay with Floor and CeilInput: standard inputOutput: standard outputTime Limit: 1 second Th ...

  2. DateFormat 中间加别的字符

    private static DateFormat dateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

  3. jQuery Validation remote的缓存请求

    不知大家有没有遇到,用jQuery Validation(本文讨论的版本为jQuery Validation Plugin 1.11.1)用remote方式做校验时,如果验证元素的值保持一致,进行多次 ...

  4. Struts2的输入校验(2)——客户端校验

    Struts2的输入校验(2) --客户端校验 Struts2客户端校验的使用: (1)使用Struts2的标签生成输入页面的表单: (2)为该<s:form>元素添加validate=& ...

  5. 【leetcode❤python】118. Pascal's Triangle

    #-*- coding: UTF-8 -*-#杨辉三角class Solution(object):    def generate(self, numRows):        "&quo ...

  6. 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]

    Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject.添 ...

  7. oracle数据库中提供的5种约束

    约束作用:用来保持数据的完整性,防止无效数据进入到数据库中.oracle数据库中提供的5种约束,都是限定某个列或者列的组合的.1.主键约束(PRIMARY KEY):在一个表中能唯一的标识一行.主键可 ...

  8. Javascript this指针

    Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.   前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对 ...

  9. 头文件为什么要加#ifndef #define #endif

    #ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...

  10. LINUX RPM卸载

    1. which httpd /usr/bin/httpd 2.rpm -q -f /usr/bin/httpd name 3.rpm -e name 如果有依赖: rpm -e --allmatch ...