HDU4632 Palindrome subsequence

博客主要围绕求一个字符串的回文子序列个数展开,直接给出问题并表示要上代码,还给出了转载来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签(空格分隔): 区间qp


Palindrome subsequence

\[求一个string的 回文子序列 的个数\]

少废话,上代码。

#include<bits/stdc++.h> //头文件没有什么问题
using namespace std; //名字空间没有什么问题
const int maxn = 1000 +5; // 字符串的最大长度
const int mod = 10007;//题目规定的模数
int n,cnt;//n:有多少个字符串,cnt:记录当前有多少个case
char s[maxn];//字符数组没有什么问题
int dp[maxn][maxn];//dp[i,j]代表[i,j]中有多少个Palindrome subsequence
int main(){
    while(~scanf("%d",&n)){
        while(n--){
            memset(dp,0,sizeof(dp));
            //置0好习惯!
            scanf("%s",s);
            //输入没有什么问题
            int len = strlen(s);
            //取字符串长度len
            for(int i=0;i<len;i++)
                dp[i][i]=1;
            //每个字符都是一个Palindrome subsequence
            for(int tail=0;tail<len;tail++){
                //枚举尾
                for(int head=tail-1;head>=0;head--){
                    //枚举头,因为头是从后往前推的,所以不会有问题
                    dp[head][tail]=(dp[head+1][tail]+dp[head][tail-1]-dp[head+1][tail-1]+mod)%mod;
                    //dp[h,t] = dp[h,t-1] + dp[h+1,t] - dp[h+1, t-1],注意取模!<这一步用到了容斥原理>
                    if(s[tail]==s[head])
                        dp[head][tail]=(dp[head][tail]+dp[head+1][tail-1]+1+mod)%mod;
                    //如果都为相等,则dp[h+1,t-1]中的每个回文子序列都可以增长一个
                    //eg. 1 234 1 , 就可以多出来121,131,141.
                }
            }
            printf("Case %d: %d\n",++cnt,dp[0][len-1]);
            //输出
        }
    }
    return 0;
    //happy end
}

转载于:https://www.cnblogs.com/yangxuejian/p/11166933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值