dp --- Codeforces 245H :Queries for Number of Palindromes
Queries for Number of Palindromes#
Problem's Link: http://codeforces.com/problemset/problem/245/H
#
Mean:
给你一个字符串,然后q个询问:从i到j这段字符串中存在多少个回文串。
analyse:
dp[i][j]表示i~j这段的回文串数。
首先判断i~j是否为回文,是则dp[i][j]=1,否则dp[i][j]=0;
那么dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i+1[j]-dp[i+1][j-1],从后往前推;
注意判断dp[i][j]是否是回文也需要从后往前推,否则超时。
Time complexity: O(n*n)
Source code:

// Memory Time // 1347K 0MS // by : crazyacking // 2015-03-31-16.17 #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<string> #include<cstdlib> #include<cstring> #include<climits> #include<iostream> #include<algorithm> #define MAXN 5005 #define LL long long using namespace std; char str[MAXN]; int dp[MAXN][MAXN]; bool judge(int sta,int en) { for(int i=sta,j=en;i<j;++i,--j) { if(str[i]!=str[j]) return false; } return true; } int main() { gets(str); int len=strlen(str); memset(dp,0,sizeof dp); for(int i=0;i<len;++i) { if(str[i]==str[i+1]) dp[i][i+1]=1; dp[i][i]=1; } for(int i=len-1;i>=0;--i) { for(int j=i;j<len;++j) { if(dp[i+1][j-1]==1&&str[i]==str[j]) dp[i][j]=1; } } for(int i=len-1;i>=0;--i) { for(int j=i;j<len;++j) { dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]; } } int q; scanf("%d",&q); while(q--) { int x,y; scanf("%d %d",&x,&y); printf("%d\n",dp[x-1][y-1]); } return 0; }
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/4383383.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2014-04-01 最小生成树