I: 字符串的匹配
时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 9
题目描述
相信大家都做许多的字符串匹配问题了,一天,503集训室的俊哥突然想出了新点子。现在给你两个字符串a,b求最长公共子串。对于是字符串匹配大师的你来说,这个再简单不过了。但是,如果现在你有k次修改机会,每次你都可以选择其中某个串的某个位置。将其修改成任意字符。
你需要合理使用这k次修改机会,使得修改后字符串的最长公共子串最长。相信这个对于你来说也很简单。
输入
题目中有多组数据,每组数据的第一行为一个整数k。表示修改次数。
输入数据的第二行和第三行是a,b两个字符串。题目保证每个串的长度不超过500。
输出
输出每一行为一个整数,表示修改后的两个串的最长公共子串长度。
样例输入
0abcdejcdkl2aaaaaababa
样例输出
25
思路:这题原来一直在想怎么dp解。。。一直在想。。一直在想。。。。本来想的是在lcs过程中,如果不相同,给他k次机会让他相同。。可是不知道怎么表示状态转移了。。其实直接暴力就好了啊。。两个for,枚举每一种可能性。。。找最长的。。。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 505;
char str1[maxn], str2[maxn];
int dp[maxn][maxn][50];
int k;
int main()
{
while(~scanf("%d", &k))
{
scanf("%s", str1);
scanf("%s", str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
int ans = -1;
for(int i = 1; i <= len1; i++)
{
for(int j = 1; j <= len2; j++)
{
int p1 = i, p2 = j, x = k, tans = 0;
while(p1 <= len1 && p2 <= len2)
{
while(str1[p1-1] == str2[p2-1] && p1 <= len1 && p2 <= len2)
p1++, p2++,tans++;
ans = max(tans, ans);
if(x)
p1++, p2++, x--,tans++,ans = max(tans, ans);
else break;
}
}
}
printf("%d\n", ans);
}
return 0;
}