HDU 4632——Palindrome subsequence
来源:互联网 发布:简明python教程图书 编辑:程序博客网 时间:2024/05/17 07:11
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4632
题目大意:
给出一个字符串,找出其中回文串的个数。
例子:
aaa
回文串有:a,a,a,aa,aa,aa,aaa
一共有7个。虽然有一些是相同的,但是其中有些字符来自原来字符串不同的位置,所以算2种。
解题思路:
动态规划。
转移方程:
dp[i][j]=(dp[i+1][j]+dp[i][j-1])
如果ch[i]==ch[j],dp[i][j]++;
否则,dp[i][j]=dp[i][j]-dp[i+1][j-1] //因为在上面做加法的时候,该区间的回文串算了2次,所以要减去。
注意最后输出的时候,要先加10007再取模
源代码:
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;char ch[1005];int dp[1005][1005]; //以第i个字符结束的回文的个数,包括第i个int main(){ freopen("in.txt","r",stdin); int cs,i,j,k,t,len,z,s,e; scanf("%d",&cs); t=0; while(cs--) { memset(ch,0,sizeof(ch)); scanf("%s",ch); len=strlen(ch); memset(dp,0,sizeof(dp)); for(i=0;i<len;i++) dp[i][i]=1; for(i=0;i<len-1;i++) { if(ch[i]==ch[i+1]) dp[i][i+1]=3; else dp[i][i+1]=2; } for(i=len-1;i>=0;i--) //枚举起点 { for(j=i+2;j<len;j++) //枚举终点 { if(ch[i]==ch[j]) { dp[i][j]++; } else { dp[i][j]-=dp[i+1][j-1]; } dp[i][j]+=dp[i+1][j]+dp[i][j-1]; dp[i][j]%=10007; } } printf("Case %d: %d\n",++t,(dp[0][len-1]+10007)%10007); } return 0;}
- HDU 4632——Palindrome subsequence
- hdu 4632——Palindrome subsequence
- HDU 4632 Palindrome subsequence
- hdu 4632 Palindrome subsequence
- hdu 4632 Palindrome subsequence
- HDU-4632-Palindrome subsequence
- hdu 4632 Palindrome subsequence
- hdu 4632Palindrome subsequence
- hdu 4632 Palindrome subsequence
- hdu-4632 Palindrome subsequence
- hdu 4632 Palindrome subsequence (dp)
- Hdu-4632 Palindrome subsequence DP
- HDU 4632 Palindrome subsequence(区间dp)
- HDU 4632 Palindrome subsequence 解题报告
- hdu 4632 Palindrome subsequence(DP)
- hdu - 4632 - Palindrome subsequence(dp)
- hdu-4632-Palindrome subsequence-记忆化dp
- hdu-4632-Palindrome subsequence DP&回文字串
- python time模块详解
- 排序算法之归并
- 掌握Linux的用户(组),权限,文件精妙的三角关系,和强大的三级帮助系统
- c 函数滚动复习记录
- 插入块并分解
- HDU 4632——Palindrome subsequence
- (6)散列冲突处理:链地址法
- VC++文件读取结尾乱码修正
- 实例详解$_SERVER函数中QUERY_STRING和REQUEST_URI等四个变量区别
- vim命令
- Python内建函数(A)
- Informatica pmrep命令用法
- java上传图片
- 一个10年程序员给大家的忠告