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;
    }

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值