1087: 回文串询问Ⅰ(经典dp)

题目描述

PIPI要考考你对回文串的掌握了~
现在有一个长度为n的字符串S,PIPI对此有q个询问,每次询问S中某个连续区间(从1开始)是否构成回文串,若是输出"yes",否则输出”no"。

输入

多组数据。
第一行为两个个整数n,q(1<=n<=1000,1<=q<=100000)
第二行为一个长为n的字符串S。
接下来q行,每行两个整数l,r,表示询问S中区间[l,r]是否构成回文串。保证l<=r且合法。

输出

对于每个询问输出占一行,输出“yes"或者”no"。

样例输入

5 3
abcba
1 5
2 4
3 4

样例输出

yes
yes
no

#include <bits/stdc++.h>
using namespace std;
int n,q;
char s1[1005];
int dp[1005][1005];
int main()
{
    while(scanf("%d%d",&n,&q)!=EOF)
    {
        memset(dp,0,sizeof(dp)); ///多组输入清空数组
        scanf("%s",s1+1);
        int len=strlen(s1+1);
        for(int i=1; i<=len; i++) ///初始化边界状态
        {
            dp[i][i]=1;
            if(i<=len-1)
            {
                if(s1[i]==s1[i+1]) ///注意初始化时要加上距离为1时的状态,否则下面执行dp[j+1][k-1]时会出错
                    dp[i][i+1]=1;
            }
        }
        for(int i=3; i<=len; i++)
        {
            for(int j=1; j+i-1<=len; j++)
            {
                int k=j+i-1;
                if(s1[j]==s1[k]&&dp[j+1][k-1]==1)
                    dp[j][k]=1;
            }
        }
        int l,r;
        while(q--)
        {
            scanf("%d %d",&l,&r);
            if(dp[l][r])
                printf("yes\n");
            else
                printf("no\n");
        }
    }
    return 0;
}

发布了78 篇原创文章 · 获赞 7 · 访问量 4575

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/104534615