您的位置:首页 > 大数据 > 人工智能

UVA 10617 - Again Palindrome

2012-10-25 13:18 169 查看
DP,
题目大意:给出一个字符串,可以去掉任意位置的字符,要求出共有多少种方法能使它变成回文串
思路分析: dp[i][j]表示第i个字符和第j个字符之间的回文串个数,
若s[i]==s[j],那么
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+dp[i+1][j-1]+1;
化简后即为:dp[i][j]=dp[i+1][j]+dp[i][j-1]+1;
若s[i]!=s[j]
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
using namespace std;
char s[70];
long long dp[70][70];
int main()
{
//freopen(\"in.txt\",\"r\",stdin);
int n;
cin>>n;
while(n--)
{
memset(dp,0,sizeof dp);
cin>>s;
int len=strlen(s);
for(int i=0; i<len; i++)
dp[i][i]=1;
for(int i=len-1; i>=0; i--)
for(int j=0; j<len; j++)
if(i<=j)
{
if(s[i]==s[j])
dp[i][j]=dp[i+1][j]+dp[i][j-1]+1;
else
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
}
cout<<dp[0][len-1]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: