Codeforces 245H Queries for Number of Palindromes:区间dp
题目链接: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));
}
}
Codeforces 245H Queries for Number of Palindromes:区间dp的更多相关文章
- codeforces 245H . Queries for Number of Palindromes 区间dp
题目链接 给一个字符串, q个询问, 每次询问求出[l, r]里有多少个回文串. 区间dp, dp[l][r]表示[l, r]内有多少个回文串. dp[l][r] = dp[l+1][r]+dp[l] ...
- dp --- Codeforces 245H :Queries for Number of Palindromes
Queries for Number of Palindromes Problem's Link: http://codeforces.com/problemset/problem/245/H M ...
- codeforces 245H Queries for Number of Palindromes RK Hash + dp
H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...
- Codeforces 245H Queries for Number of Palindromes
http://codeforces.com/contest/245/problem/H 题意:给定一个字符串,每次给个区间,求区间内有几个回文串(n<=5000) 思路:设定pd[i][j]代表 ...
- K - Queries for Number of Palindromes(区间dp+容斥)
You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There a ...
- Codeforces245H - Queries for Number of Palindromes(区间DP)
题目大意 给定一个字符串s,q个查询,每次查询返回s[l-r]含有的回文子串个数(题目地址) 题解 和有一次多校的题目长得好相似,这个是回文子串个数,多校的是回文子序列个数 用dp[i][j]表示,s ...
- codeforces H. Queries for Number of Palindromes(区间dp)
题目链接:http://codeforces.com/contest/245/problem/H 题意:给出一个字符串还有q个查询,输出每次查询区间内回文串的个数.例如aba->(aba,a,b ...
- [CF245H] Queries for Number of Palindromes (容斥原理dp计数)
题目链接:http://codeforces.com/problemset/problem/245/H 题目大意:给你一个字符串s,对于每次查询,输入为一个数对(i,j),输出s[i..j]之间回文串 ...
- cf245H Queries for Number of Palindromes (manacher+dp)
首先马拉车一遍(或者用hash),再做个前缀和处理出f[i][j]表示以j为右端点,左端点在[i,j]的回文串个数 然后设ans[i][j]是[i,j]之间的回文串个数,那就有ans[i][j]=an ...
随机推荐
- Ubuntu 16.04 安装opencv的各种方法(含opencv contrib扩展包安装方法)
Ubuntu 16.04 安装opencv的各种方法(含opencv contrib扩展包安装方法) https://blog.csdn.net/ksws0292756/article/details ...
- iOS swift 给MBProgressHUD添加分类
MBProgressHUD在开发中经常会用到,今天把MBProgressHUD的方法拓展了一下,更加方便使用 1.可以实现gif图片的展示,使用时请替换test.gif 2.可以控制是否允许交互,如果 ...
- rm 命令简要
rm 单独使用只能删除文件不能删除文件夹 rm -r 可以删除文件夹和文件 1.rm test.txt 删除文件 2.rm -r test.txt 每次删除的时候都询问是 ...
- Swift迎来了1.0 GM 版(2014.09.09)
2014年6月2日,swift开发团队将swift语言公之于众.而2014年9月9日迎来了swift的第二个里程碑,swift1.0版本号(GM),这意味着无论你的应用有一部分功能是用swift写的, ...
- linux中的热插拔和mdev机制
mdev手册(自己翻译的留着看) mdev实现U盘或SD卡的自动挂载 mdev的使用以及mdev.conf的规则配置--busybox linux中的热插拔和mdev机制 关于实现udev/mdev自 ...
- memcached 输入命令后无法启动
键入命令启动memcached服务器,没有任何反应,使用telnet 127.0.0.1 11211 也是无法链接. memcached -d -m -u root -l -c -P /tmp/mem ...
- 文本信息检索——布尔模型和TF-IDF模型
文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
- WPF 自定义快捷键命令(COMMAND)(转)
命令简介 WPF 中的命令是通过实现 ICommand 接口创建的.ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged).Exec ...
- willMoveToParentViewController和didMoveToParentViewController
本文转载至 http://blog.csdn.net/yongyinmg/article/details/40619727 iOS 5.0 后UIViewController新增:willMoveTo ...
- 【python】-- 继承式多线程、守护线程
继承式多线程 1.定义 继承式多线程是自己自定义类,去继承theading.Tread这个类,通过类实例.start()启动,去执行run方法中的代码. import threading import ...