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