Codeforces 245H Queries for Number of Palindromes:区间dp
2024-09-02 05:56:41
题目链接:http://codeforces.com/problemset/problem/245/H
题意:
给你一个字符串s。
然后有t个询问,每个询问给出x,y,问你区间[x,y]中的回文子串的个数。
题解:
表示状态:
dp[x][y] = numbers
表示区间[x,y]中的回文子串个数。
找出答案:
每次询问:ans = dp[x][y]
如何转移:
dp[x][y] = dp[x][y-1] + dp[x+1][y] - dp[x+1][y-1] + pal[x][y]
用到了容斥原理。
pal[x][y]表示子串s[x to y]是否是一个回文串(是为1,不是为0)。
其中pal[x][y]又有递推式:
pal[x][y] = ( s[x]==s[y] && (x+1==y || pal[x+1][y-1]) )
记忆化搜索就好啦。
边界条件:
if(x>y) dp[x][y] = 0
if(x==y) dp[x][y] = 1
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 5005 using namespace std; int t;
int dp[MAX_N][MAX_N];
int pal[MAX_N][MAX_N];
char s[MAX_N]; int is_pal(int x,int y)
{
if(s[x]!=s[y]) return ;
if(x+==y) return ;
if(pal[x+][y-]!=-) return pal[x+][y-];
return pal[x+][y-]=is_pal(x+,y-);
} int dfs(int x,int y)
{
if(dp[x][y]!=-) return dp[x][y];
if(x>y) return ;
if(x==y) return dp[x][y]=pal[x][y]=;
dp[x][y]=dfs(x,y-)+dfs(x+,y)-dfs(x+,y-);
pal[x][y]=(s[x]==s[y] && (x+==y || pal[x+][y-]));
return dp[x][y]=dp[x][y]+pal[x][y];
} int main()
{
scanf("%s%d",s+,&t);
memset(dp,-,sizeof(dp));
int x,y;
while(t--)
{
scanf("%d%d",&x,&y);
printf("%d\n",dfs(x,y));
}
}
最新文章
- 【Win10】【Win2D】实现控件阴影效果
- HyperLink控件
- throw 子句
- IP101A芯片默认物理地址(PHY Adress)确定
- 2016030206 - mysql常用命令
- JavaScript_变量的自动转换和语句
- CALayer的基本操作
- lua学习笔记之-语言基础
- favicon支持的图片格式
- Java学习笔记之接口和抽象类
- POJ_2769同余问题
- centos基本命令
- centos7启动网卡报错(Failed to start LSB: Bring up/down networking )
- Ubuntu16.04 导入tensorflow报错
- sqoop 测试 --hive-delims-replacement 参数
- 计算机系统的通信PPT版本
- android彻底关闭应用程序方法
- .io域名在申请SSL证书时被坑
- (zhuan) 资源|TensorFlow初学者必须了解的55个经典案例
- 【转】如何使用MAT分析内存泄漏
热门文章
- Python内置函数之super()
- 如何突破PHP程序员的技术瓶颈分析
- 配置Nginx防止直接用IP訪问Webserver
- android 软键盘监听显示和隐藏
- 程序包 javax.servlet 不存在 解决办法
- iptables启动脚本分析
- CG标准函数库——数学函数(GPU编程与CG语言之阳春白雪下里巴人)
- Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
- Linux 服务器配置JDK
- Latent Activity Trajectory (LAT)