HDU4632 Palindrome subsequence
2024-09-23 18:11:23
标签(空格分隔): 区间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
}
最新文章
- 搞不清FastCgi与PHP-fpm之间是个什么样的关系?
- [Note] Build your SDL2 Environment in Visual Studio 2013 配置你的SDL2运行环境
- Trie树的应用:查询IP地址的ISP
- automaticallyAdjustsScrollViewInsets (iOS)
- ArcGis——好好的属性表,咋就乱码了呢?
- BZOJ3029守卫者的挑战(概率dp)
- 关于MYSQL ERROR1045 报错的解决办法
- php之memcached存储session配置、存储、获取
- Java语法基础学习DayEight
- ubuntu 17.10.1 安装 virtual box 增强工具
- [py][mx]django注册-邮件激活
- ICD2 VPP limiter for new PIC microcontrollers.
- ScaleIO 1.2 基础
- php if语句判定ms查询是否为空
- django wsgi nginx 配置
- Python3爬虫(一)HTTP相关基础
- 常用模块random,time,os,sys,序列化模块
- AJPFX关于java中可访问控制符和非访问控制符的详细总结
- Windows JDK 1.8降级为1.7方法
- [RxJS] Implement pause and resume feature correctly through RxJS