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;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }