题意:
给你一个整数n和字符串str,现在让你在str中找出两个连续的字串计算两个字串的距离。距离 ,求满足在dis不超过n的状态下,n的最大值。
分析:
用dp[i][j]数组记录字串i-j的dis, 前半部分是A串,后半部分是B串,然后枚举n,二分查找。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5*1e3+10;
short dp[maxn][maxn] , n , len;
char s[maxn];
bool is_ok(int mid)
{
int i , j;
for(i=0; i<len; i++)
{
int j = i + mid - 1;
for(int k=j+1; k+mid-1<len; k++)
{
if(dp[i][k+mid-1] - dp[j+1][k-1] <= n)
return true;
}
}
return false;
}
int main()
{
int t , i , j;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
scanf(" %s", s);
len = strlen(s);
for(i=0; i<len-1; i++)
{
dp[i][i] = 0;
dp[i][i+1] = abs(s[i]-s[i+1]);
}
for(int k=3; k<=len; k++)
{
for(i=0; i+k-1<len; i++)
{
j = i+k-1;
dp[i][j] = dp[i+1][j-1] + abs(s[i]-s[j]);
}
}
int l = 0 , r = len;
int ans = 0 , mid;
while(l <= r)
{
int mid = (l + r) / 2;
if(is_ok(mid))
l = mid + 1 , ans = mid;
else
r = mid - 1;
}
printf("%d\n", ans);
}
return 0;
}