题目链接: [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;
}