hdu4632 Palindrome subsequence
来源:互联网 发布:用友软件好用吗 编辑:程序博客网 时间:2024/04/30 10:33
注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序列的个数,有递推关系:
dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]
如果i和j位置出现的字符相同,那么dp[i][j]=dp[i+1][j]+dp[i][j-1]+1
,注意边界特判一下就可以了
#include <cstdio>#include <algorithm>#include<cstring>#include<iostream>#include <cmath>using namespace std;int dp[1100][1100]={0};int main(){ //freopen("in.txt","r",stdin ); int t; scanf("%d",&t); int ti; for(ti=1;ti<=t;++ti) { //memset(dp,0,sizeof(dp)); char ch[1100]; scanf("%s",ch); int l=strlen(ch); int i; for(i=1;i<=l;++i) dp[i][i]=1; int ll=1; for(;ll<l;++ll) { for(i=1;i<=(l-ll);++i) { if(ch[i-1]!=ch[i+ll-1]) dp[i][i+ll]=dp[i][i+ll-1]+dp[i+1][i+ll]-dp[i+1][i+ll-1]+10007; else if(ll==1) dp[i][i+ll]=dp[i][i+ll-1]+dp[i+1][i+ll]+1; else dp[i][i+ll]=dp[i][i+ll-1]+dp[i+1][i+ll]+1; dp[i][i+ll]=dp[i][i+ll]%10007; } }// for(int p=1;p<=l;++p)// {// for(int pp=1;pp<=l;++pp)// {// cout<<dp[p][pp]<<' ' ;// }cout<<endl;// } printf("Case %d: %d\n",ti,dp[1][l]); } return 0;}
- HDU4632 Palindrome subsequence
- hdu4632 Palindrome subsequence
- 【HDU4632】【Palindrome subsequence】
- Hdu4632 Palindrome subsequence
- HDU4632:Palindrome subsequence(区间DP)
- Palindrome subsequence(hdu4632,DP)
- hdu4632 Palindrome subsequence--区间dp
- HDU4632 Palindrome subsequence(区间DP)
- hdu4632
- Palindrome subsequence
- Palindrome subsequence
- HDOJ 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
- 关于Integer.parseInt
- 学习笔记--SpringMVC 3.1下返回json时中文显示乱码问题的解决方案
- eclipse server Runtime Environment 环境配置
- 纠结
- STL iterator的自己实现
- hdu4632 Palindrome subsequence
- 牙齿保健
- java基础加强01 枚举
- C++ 虚函数表解析
- ACE框架简介以及一个基于ACE的C/S服务程序实例
- DP问题各种模型的状态转移方程
- MFC文档序列化实现保存和加载
- python-Levenshtein几个计算字串相似度的函数解析
- eclipse 初次java开发问题总结