Genetic Fraud

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;

}

你可能感兴趣的:(net)