Codeforces 245H Queries for Number of Palindromes
2014-05-12 20:32
387 查看
很简单的回文
dp[i][j]表示从str[i]到str[j]中有几个回文子序列
当str[i]!=str[j]时候
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]
当str[i]!=str[j]时候
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+1
如何判断substr[i][j]是回文呢,依然是递归,如果substr[i+1][j-1]是回文且str[i]==str[j],那么substr[i][j]是回文
这里明显看到字符串是在向中间转移,用递归写比较方便
注意i==j和i==j-1这两种情况
上代码
dp[i][j]表示从str[i]到str[j]中有几个回文子序列
当str[i]!=str[j]时候
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]
当str[i]!=str[j]时候
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+1
如何判断substr[i][j]是回文呢,依然是递归,如果substr[i+1][j-1]是回文且str[i]==str[j],那么substr[i][j]是回文
这里明显看到字符串是在向中间转移,用递归写比较方便
注意i==j和i==j-1这两种情况
上代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <math.h> #include <algorithm> #define SCAND(x) scanf("%d",&(x)); #define SCANS(x) scanf("%s",(x)); #define PRINTD(x) printf("%d",(x)); using namespace std; const int INF=1<<30; char str[5555]; int is_s[5555][5555]; int f[5555][5555]; bool is(int i,int j)//判断substr[i][j]是不是回文,用了is_s数组保存已经得到的结果 { if(is_s[i][j]!=-1) return is_s[i][j]; if(i==j||((i==j-1)&&(str[i]==str[j]))) { is_s[i][j]=1; return true; } if((i==j-1)&&(str[i]!=str[j])) { is_s[i][j]=0; return false; } if(is(i+1,j-1)&&str[i]==str[j]) { is_s[i][j]=1; return true; } else { is_s[i][j]=0; return false; } } int f_f(int i,int j)//递归地算出substr[i][j]有几个回文字串 { if(f[i][j]!=-1) return f[i][j]; if(i==j) { return f[i][j]=1; } if((i==j-1)&&(str[i]==str[j])) { return f[i][j]=3; } if((i==j-1)&&(str[i]!=str[j])) { return f[i][j]=2; } if(/*is_s[i+1][j-1]*/is(i+1,j-1)&&str[i]==str[j]) { return f[i][j]=f_f(i,j-1)+f_f(i+1,j)-f_f(i+1,j-1)+1; } else { return f[i][j]=f_f(i,j-1)+f_f(i+1,j)-f_f(i+1,j-1); } } void Input() { scanf("%s",str); } void Solve() { int len=strlen(str); memset(is_s,-1,sizeof(is_s)); memset(f,-1,sizeof(f)); //is(0,len-1); int n,l,r; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&l,&r); printf("%d\n",f_f(l-1,r-1)); } } int main() { #ifndef ONLINE_JUDGE freopen("H:/in.txt","r",stdin); //freopen("H:/out.txt","w",stdout); #endif Input(); Solve(); }
相关文章推荐
- 【DP】 codeforces 464C Substitutes in Number
- Codeforces 606E Freelancer's Dreams - 线性规划
- CODEFORCES 450D Jzzhu and Cities <最短路径>
- codeforces-750【C思维】
- CodeForces 825F Educational Round #25 F:KMP最小循环节+DP
- codeforces 888A.Local Extrema(水)
- Codeforces_431C_k-Tree(背包)
- 【CodeForces 604B】F - 一般水的题1-More Cowbe
- Codeforces 699A Launch of Collider
- CodeForces - 749C Voting (队列)
- CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢
- codeforces 13a(进制转换)
- Codeforces 466 A. Cheap Travel
- Codeforces 424C Magic Formulas
- CodeForces 699B One Bomb(暴力)
- Codeforces 83C
- CodeForces 3 D.Least Cost Bracket Sequence(贪心+优先队列)
- Codeforces 601D. Acyclic Organic Compounds(四个愿望一次满足)
- codeforces 466B Wonder Room(思维,暴力)
- Problem - 452A - Codeforces解题报告