-
Queries for Number of Palindromes
- CodeForces - 245H
- 题意:查询操作,询问区间有多少个 回文串。
- 思路:查询次数较多,预处理后直接查询,通过区间DP来解决这个问题,大区间由小区间转移而来
- 从小区间到大区间的转移方程为:
-
dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1];
- 这里用到了一个判断新构成的i-j区间是否是回文串,所以也需要预处理,is[][]数组
- is[][]数组的初始化思路也是区间DP只有小区间是回文并且str[i]==str[j]时大区间才也构成回文。
-
#include<bits/stdc++.h> using namespace std; #define maxn 5555 int is[maxn][maxn]; int dp[maxn][maxn],q,l,r; char str[maxn]; int main() { scanf("%s",str); int n=strlen(str); for(int i=0; i<n; i++) dp[i][i]=is[i][i]=1; for(int len=1; len<n; len++) for(int i=0; i+len<n; i++) { int j=i+len; if(str[i]==str[j]) { if(len!=1) is[i][j]=is[i+1][j-1]; else is[i][j]=1; } else is[i][j]=0; } for(int len=1; len<n; len++) for(int i=0; i+len<n; i++) { int j=i+len; dp[i][j]=dp[i+1][j]+dp[i][j-1]+is[i][j]-dp[i+1][j-1]; } scanf("%d",&q); while(q--) { scanf("%d%d",&l,&r); printf("%d\n",dp[l-1][r-1]); } return 0; }
Queries for Number of Palindromes CodeForces - 245H -区间DP
最新推荐文章于 2019-07-25 11:25:31 发布