D. Alyona and Strings

题意

给出两个字符串s,t,让找出最长的k个在s,t不相交的公共子串。

思路

看了好几个题解才搞懂。

代码中有注释

代码

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f; char s[N],t[N],k;
int dp[1010][1010][11][2];
/*
终于搞明白了
dp[i][j][k][0]表示的是s的前i个字符,t的前j个字符,选择k个公共子串的最大值(不一定包括i,j)
dp[i][j][k][1]表示的是s的前i个字符,t的前j个字符,选择k个公共子串最后是i,j的最大值
dp[lens][lent][k][0]就是题目要求的答案。
当s[i]==t[j]的时候dp[i][j][k][1]才存在(不为0)
*/
int main()
{
int lens,lent;
scanf("%d%d%d%s%s",&lens,&lent,&k,s+1,t+1);
for(int i=1; i<=lens; i++)
{
for(int j=1; j<=lent; j++)
{
for(int l=1; l<=k; l++)
{
if(s[i]==t[j])//只有s[i]==t[j]的时候才有dp[i][j][l][1]
dp[i][j][l][1]=max(dp[i-1][j-1][l][1]+1,dp[i-1][j-1][l-1][0]+1);
/*可以沿用之前的第l个公共子串,或者让i,j作为第l个子串的第一位*/
dp[i][j][l][0]=max(dp[i-1][j][l][0],max(dp[i][j-1][l][0],dp[i][j][l][1]));
}
}
}
printf("%d\n",dp[lens][lent][k][0]);
return 0;
}
/*
*/

最新文章

  1. lucene 基础知识点
  2. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
  3. xml Schema 基础
  4. PyCharm不能自动import解决方法_PyCharm cannot auto import package troubleshooting
  5. [Spring] - 读写分离
  6. 本地调试webapi
  7. javascript十六进制数字和ASCII字符之间转换
  8. javaSE第二十四天
  9. hibernate--联合主键(了解+,掌握-)
  10. request.getRequestDispatcher()和response.sendRedirect()
  11. 【STL源码学习】细品vector
  12. iOS之GCDAsyncSocket第三方库的使用
  13. 实习小白笔记一(鼠标悬停、获取多选、提交修改、layer页面、单元格文字长度、json、分页、左连接)
  14. javascript 中遍历数组的简单方法
  15. MarkDown&amp;思维导图
  16. js动画 Css提供的运动 js提供的运动
  17. C#中统计一个过程消耗的时间
  18. Android 将系统的back键模拟成为home键的功能
  19. 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard
  20. python聚合云图

热门文章

  1. Python - 批量获取文件夹的大小输出为文件格式化保存
  2. redis 分布式锁的 5个坑,真是又大又深
  3. radio取值
  4. Lesson0423
  5. python 中自带的堆模块heapq
  6. go获取当前项目下所有依赖包
  7. nignx location index的用法
  8. 递归复制&amp;查看文件夹下的指定后缀的文件
  9. ARP/RARP报文格式
  10. MySQL系列(一)