http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24020

根据一般的字符串的dp,考虑串a的前i个,和串b的前j个

那么我们用dp【i】【j】表示包含a串的第i个字母 b串的第j个字母 可以获得的最大长度

那么显然有:因为要包含 i j 所以如果 abs(a[i]-b[j])<=1 那么 dp[i][j]=dp[i-1][j-1]+1; 否则 dp[i][j]=0;

View Code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#define maxn 1002
using namespace std;
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int n;
void solve(int num)
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
                {
                if(abs(s1[i]-s2[j])<=1)
                dp[i][j]=dp[i-1][j-1]+1;//满足条件,加1
                else
                dp[i][j]=0;//不满足 为0
                if(dp[i][j]>=num)
                {
                cout<<"POSITIVE"<<endl;//如果已经大于了一半 输出满足并返回
                return ;
                }
                }
      }
      cout<<"NEGATIVE"<<endl;
//没有符合条件的 输出不满足
      return ;
}
int main()
{
    int test;
    cin>>test;
    while(test--)
    {
        cin>>n;
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        scanf("%s %s",s1+1,s2+1);

        solve((n+1)/2);//要满足长度大于一半
    }
    return 0;
}
posted on 2012-08-30 20:04  一把刷子  阅读(195)  评论(0编辑  收藏  举报