题目链接: [CodeForces159D]Palindrome pairs[dp]
题意分析:给出一个字符串,求其中满足s[a..b]s[x..y] && a<=b<x<=y的回文串一共有几个(PS:s[a..b]s[x..y]是成对出现的)
解题思路:这题采取DP的思想来做,设置两个数组:dpr[i]和dpl[i]。
dpl[i]代表:以i为开头的回文串个数;dpr[i]代表:以i为结尾的回文串个数;
由于a,b只需满足a,b<x,y即可,在求出dpr后,对dpr进行累加,就可变dpr[i]为从0开始到i为止,左边回文串的个数
具体代码如下:
#include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<string> #include<cctype> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int main() { int dpl[2015],dpr[2015]; //dpl[i]:以i为开头的回文串 dpr[i]:以i结尾的回文串;即:回文串str[dpl,dpr] string str; while (cin >> str) { unsigned long long length = str.size(); memset(dpr,0,sizeof(dpr)); memset(dpl,0,sizeof(dpl)); for (int i = 0; i < length; ++i) { for (int r = i, l = i; r < length && l >= 0 && str[l] == str[r]; ++r, --l) dpl[l]++,dpr[r]++; //奇数回文 for (int r = i + 1, l = i; r < length && l >= 0 && str[l] == str[r]; ++r, --l) dpl[l]++,dpr[r]++; //偶数回文 } for (int i = 1; i < length; ++i) dpr[i] += dpr[i-1]; //累加后dpr[i]含义变为:从开头到i为止的str[a..b]回文串个数 long long sum = 0; for (int i = 1; i < length; ++i) sum += dpr[i-1]*dpl[i]; cout << sum << endl; } return 0; }