先说HDU 4632这道题,因为比较简单,题意就是给你一个字符串,然后给你一个区间,叫你输出区间内所有的回文子序列,注意是回文子序列,不是回文字串。

用dp[i][j]表示区间[i,j]内的回文子序列的个数。

那么可以得到状态转移方程:dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1] + a[i] == a[j] 。

#define N 1005
#define MOD 10007
int dp[N][N] ;
char a[N] ;
int main() {
int T ;
cin >> T ;
int cc = 0;
while( T -- ){
cin >> a ;
int l = strlen(a) ;
mem(dp ,0 ) ;
for (int i = 0 ; i < l ; i ++ )dp[i][i] = 1 ;
for (int i = 2 ; i <= l ; i ++ ){//枚举长度
for (int j = 0 ; j + i - 1 < l ; j ++ ){//枚举起点
int s = j ;
int e = j + i - 1 ;
if(a[s] == a[e])dp[s][e] ++ ;
else {
if(s + 1 <= e - 1){
dp[s][e] -= dp[s + 1][e - 1] ;
dp[s][e] = (dp[s][e] + MOD) % MOD ;
}
}
dp[s][e] += ( dp[s + 1][e] + dp[s][e - 1] ) % MOD ;
}
}
printf("Case %d: ",++cc) ;
cout << (dp[0][l - 1] + MOD ) % MOD << endl;
}
return 0 ;
}

CF 245H .这道题的题意差不多,不过他是给出区间,求出区间内的回文字串的个数。

上面那道题之所以我认为简单,是因为他不用判断[i , j ]之间是不是回文,因为他只需要计数就可以了。

而这道题,即使a[i] == a[j],也要判断[i + 1 , j - 1]之内是不是回文。

这里我是多开一个数组来存当前区间是否是回文,用isP[i][j]来判断这个区间是否是回文。

初始化isP[i][i] = 1 ,dp[i][i] = 1 ,因为他本身肯定是回文。

当然初始化的时候还要注意isP[i + 1][i] = 1 ,因为我们注意到,当枚举到长度为2的时候,我们假设字符串为aa 。

那么首先a[i] == a[j] .然后还要判断[i + 1, j - 1]是否是回文,那么我们注意到,其实i + 1 > j - 1。实际上i + 1 = (j - 1 + 1),但是这个情况其实也是回文。

所以我们要多初始化一位,让isP[i + 1][i] = 1 ,这是对长度为2的字串进行特殊的处理。

明白了这点。那么状态转移方程就很好写了:dp[i][j] = dp[i][j - 1] + dp[i + 1][j] - dp[i + 1][j - 1] + a[i] == a[j] && isP[i + 1][j - 1]。

#define N 5005
char a[N] ;
int dp[N][N] ;
int isP[N][N] ;
int main() {
scanf("%s",a + 1) ;
int n ;
cin >> n ;
int l = strlen(a + 1) ;
for (int i = 1 ; i <= l ; i ++ )dp[i][i] = 1 ,isP[i][i] = 1 , isP[i + 1][i] = 1 ;
for (int i = 2 ; i <= l ; i ++ ) {
for (int j = 1 ; j + i - 1 <= l ; j ++ ) {
int s = j ;
int e = j + i - 1 ;
isP[s][e] = isP[s + 1][e - 1] && a[s] == a[e] ;
dp[s][e] += dp[s + 1][e] + dp[s][e - 1] - dp[s + 1][e - 1] + isP[s][e];
}
}
while(n -- ) {
int aa , bb ;
RD(aa) ;
RD(bb) ;
OT(dp[aa][bb]) ;
puts("") ;
}
return 0 ;
}

HDU 4632 CF 245H 区间DP(回文)的更多相关文章

  1. HDU 4632 Palindrome subsequence(区间DP求回文子序列数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...

  2. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

  3. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

  4. CodeForces-245H:Queries for Number of Palindromes(3-14:区间DP||回文串)

    Times:5000ms: Memory limit:262144 kB 给定字符串S(|S|<=5000),下标由1开始.然后Q个问题(Q<=1e6),对于每个问题,给定L,R,回答区间 ...

  5. LightOJ - 1205:Palindromic Numbers (数位DP&回文串)

    A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the sam ...

  6. dp回文

    .dp回文子串 通常在dp数组中存放的是 从i到j是否是回文子串 1.动态规划 2.中心扩展法 #include<iostream> #include<algorithm> # ...

  7. HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)

    题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...

  8. hdu 4632区间dp 回文字串计数问题

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  9. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

随机推荐

  1. Unity 技能按钮触发特效

    unity 版本:4.5.1 NGUI版本:3.6.5 首先,要导入特效资源包,导入应该是基本中的基础,但是对于初学者来说好像很少有这方面的介绍,也许是我现学现用书看的不够认真,因为导入这个问题卡了好 ...

  2. The Cow Lexicon(dp)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7290   Accepted: 3409 Description Few k ...

  3. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  4. POJ-3189-Steady Cow Assignment(最大流+枚举)

    题意 此题题意不太好懂.现有n头牛和b个牛棚,每个牛棚可以养的牛的数目都有一个限制c[i],表示该牛棚最多只能关c[i]头牛,每头牛对每一个牛棚都有一个喜爱值,用1到b来表示,现在要安排这些牛,使得牛 ...

  5. entityframework分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法

    首先是ef的多数据库操作实现事务的方法 public int AddDifferenceDB(userinfo1 user1, userinfo user) { ; using (var test2D ...

  6. 如何解决升级WIN服务的时候,不暴力停止服务 达到升级的目的

    同一个WIN服务,分别部署在A.B两台服务器上,前面使用netscaler负载均衡 ,A和B被请求频繁,几乎时时刻刻都被请求   .PS:发布WIN服务的正常流程是,停止WIN服务->发布WIN ...

  7. tcpCopy

    tcpcopy是一种应用请求复制(基于tcp的packets)工具,其应用领域较广,我们曾经应用于网易的广告投放系统,urs系统,nginx hmux协议开发等系统,避免了上线带来的很多问题. 总体说 ...

  8. 使用python进行接口测试

    最近在做接口测试,之前公司的方案是使用postman进行接口测试.但是伟大的墙导致我们只能用离线版postman..然后一个很长很长的接口列表,一个接一个的访问.我的天哪..所以萌生了一个想法,使用p ...

  9. Swing实现文件选择(目录选择)附导出

    具体生成工具如图: (1) (2) (3) (4) 源码 : example.java package org.qiailin.jframe; import java.awt.Container; i ...

  10. 环境搭建之maven分布式系统

    shoppingmall项目: 一.父工程  shoppingmall-parent  (packaging为pom) 此是本项目的顶级工程,所有子工程都应该继承他,主要可承担以下任务: a.集中定义 ...