Queries for Number of Palindromes CodeForces - 245H -区间DP

  • Queries for Number of Palindromes

  •  CodeForces - 245H 
  • 题意:查询操作,询问区间有多少个 回文串。
  • 思路:查询次数较多,预处理后直接查询,通过区间DP来解决这个问题,大区间由小区间转移而来
  • 从小区间到大区间的转移方程为:
  • dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1];
  • 这里用到了一个判断新构成的i-j区间是否是回文串,所以也需要预处理,is[][]数组
  • is[][]数组的初始化思路也是区间DP只有小区间是回文并且str[i]==str[j]时大区间才也构成回文。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 5555
    int is[maxn][maxn];
    int dp[maxn][maxn],q,l,r;
    char str[maxn];
    int main()
    {
        scanf("%s",str);
        int n=strlen(str);
        for(int i=0; i<n; i++)
            dp[i][i]=is[i][i]=1;
        for(int len=1; len<n; len++)
            for(int i=0; i+len<n; i++)
            {
                int j=i+len;
                if(str[i]==str[j])
                {
                    if(len!=1)
                        is[i][j]=is[i+1][j-1];
                    else is[i][j]=1;
                }
                else
                    is[i][j]=0;
            }
        for(int len=1; len<n; len++)
            for(int i=0; i+len<n; i++)
            {
                int j=i+len;
                dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1];
            }
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d",&l,&r);
            printf("%d\n",dp[l-1][r-1]);
        }
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/83745132