题目大概说给两个字符串s和t,然后要求一个包含k个字符串的序列,而这个序列是两个字符串的公共子序列,问这个序列包含的字符串的总长最多是多少。

如果用DP解,考虑到问题的规模,自然这么表示状态:

  • dp[i][j][k]表示s[0...i]与t[0...j]包含k个字符串的公共子序列的最大总长

想怎么转移时,我发现这样表示状态不好转移,还得加一维:

  • dp[i][j][k][0]表示s[0...i]与t[0...j]包含k个字符串的公共子序列的最大总长,且s[i]和t[j]不属于序列第k个字符串
  • dp[i][j][k][1]表示s[0...i]与t[0...j]包含k个字符串的公共子序列的最大总长,且s[i]和t[j]属于序列第k个字符串

转移的话:

  • dp[i][j][k][1]能转移仅s[i]=t[j],可以通过在s[0...i-1]和t[0...j-1]的后面作为新加的序列字符串转移,即d[i-1][j-1][k-1]+1;也可以不作为新加的序列字符串,与前面的拼接转移,不过仅当s[i-1]=t[j-1],即dp[i-1][j-1][k]+1;
  • dp[i][j][k][0]就是s[i]、t[j]忽略的情况,从dp[i-1][j][k]、dp[i][j-1][k]和dp[i][j][k]转移

转移感觉很麻烦,写着写着调着调着,终于过了样例,然后直接提交——居然就AC了?简直不敢相信。。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[][][][];
int main(){
int n,m,K;
char s[]={},t[]={};
scanf("%d%d%d",&n,&m,&K);
for(int i=; i<n; ++i){
scanf(" %c",&s[i]);
}
for(int i=; i<m; ++i){
scanf(" %c",&t[i]);
}
memset(d,,sizeof(d));
if(s[]==t[]) d[][][][]=;
for(int i=; i<n; ++i){
for(int j=; j<m; ++j){
if(i== && j==) continue;
for(int k=; k<=K; ++k){
if(i==){
if(s[i]==t[j]){
d[i][j][][]=;
}
d[i][j][][]=max(d[i][j-][][],d[i][j-][][]);
}else if(j==){
if(s[i]==t[j]){
d[i][j][][]=;
}
d[i][j][][]=max(d[i-][j][][],d[i-][j][][]);
}else{
if(s[i]==t[j]){
d[i][j][k][]=max(d[i-][j-][k-][],d[i-][j-][k-][])+;
if(s[i-]==t[j-]) d[i][j][k][]=max(d[i][j][k][],d[i-][j-][k][]+);
}
d[i][j][k][]=max(d[i-][j][k][],d[i][j-][k][]);
d[i][j][k][]=max(d[i][j][k][],d[i][j-][k][]);
d[i][j][k][]=max(d[i][j][k][],d[i-][j][k][]);
d[i][j][k][]=max(d[i][j][k][],d[i-][j-][k][]);
if(s[i-]==t[j-]) d[i][j][k][]=max(d[i][j][k][],d[i-][j-][k][]);
}
}
}
}
printf("%d",max(d[n-][m-][K][],d[n-][m-][K][]));
return ;
}

Codeforces 682D Alyona and Strings(DP)的更多相关文章

  1. CodeForces 682D Alyona and Strings (四维DP)

    Alyona and Strings 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/D Description After re ...

  2. CodeForces - 710E Generate a String (dp)

    题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...

  3. Codeforces 543C Remembering Strings(DP)

    题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...

  4. HDU 6170----Two strings(DP)

    题目链接 Problem Description Giving two strings and you should judge if they are matched.The first strin ...

  5. Educational Codeforces Round 51 D. Bicolorings(dp)

    https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...

  6. Codeforces 536D - Tavas in Kansas(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...

  7. Codeforces 295D - Greg and Caves(dp)

    题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...

  8. Codeforces 467C George and Job(DP)

    题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...

  9. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

随机推荐

  1. JS时间自动更新

    js部分: <!--自动更新时间--><script>function show(){var date = new Date(); //日期对象var now = " ...

  2. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

  3. 再来一发!DB2 应用程序如何从数据库取数据 Fetch

    The FETCH statement positions a cursor on the next row of its result table and assigns the values of ...

  4. NYOJ题目74小学生算术

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAI0CAIAAACRUHjwAAAgAElEQVR4nO3dO3LbyroG0DsJ5RqIYg

  5. [插件]jQuery multiselect初始化及默认值修改

    下载地址:http://pan.baidu.com/s/1dE2daSD 1.Jquery多选下拉列表插件jquery multiselect功能介绍及使用 http://www.jb51.net/a ...

  6. 【Java环境变量的配置问题】

    首先是JVM.JRE.JDK三者之间的关系: java的跨平台性依赖于Java虚拟机:jvm(Java Virtual Machine),而jre(Java Runtime Environment,中 ...

  7. 【openGL】画圆

    #include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...

  8. 攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系

    本文以Customer和Address类的关系为例说明一对一关联映射:以Category和Item类的关系说明多对多关联关系.一.映射一对一关联: 分两种情况:按照外键映射和按照主键映射.这两种方式的 ...

  9. hdu 4031 2011成都赛区网络赛A题 线段树 ***

    就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! #include<cstdio> #include<iostream&g ...

  10. CodeIgniter中驱动器的使用方法

    驱动器“Drivers”是CodeIgniter框架从2.0版本开始加入的新特性.正如中文版译者所言: 笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充. 1. ...