hdu 6103 Kirinriki

来源:互联网 发布:c语言线程同算法 编辑:程序博客网 时间:2024/06/05 17:05

链接

题意:

给你一个整数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;}