当前位置:   article > 正文

回文子串(区间动态规划)_回文子串动态规划

回文子串动态规划

题目链接:22算法设计与分析-动态规划 - Virtual Judge

 

分析:这道题目是一道比较简单的区间动态规划,但是有一个坑点卡了我挺长时间所以我想在这分析一下

设f[i][j]表示从i到j的最长回文子串长度

我一开始想的是当s[i]==s[j]时就有f[i][j]=f[i+1][j-1]+2,若s[i]!=s[j]则有f[i][j]=0,但是这样想是错误的,因为i~j是回文子串不仅需要s[i]==s[j],还需要i+1~j-1也是回文子串才行,所以说我们知道s[i]==s[j]时不能直接使f[i][j]=f[i+1][j-1]+2,还应该判断一下i+1~j-1是不是回文子串,我一开始就是因为忘记判这个条件导致wa了两次,还有一点需要注意的就是空串也算是长度为1的回文子串,所以我们可以先把长度为2的回文字串预处理出来

下面是代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<map>
  7. #include<cmath>
  8. #include<queue>
  9. using namespace std;
  10. const int N=1e3+10;
  11. int f[N][N];
  12. char s[N];
  13. int main()
  14. {
  15. scanf("%s",s+1);
  16. int l=strlen(s+1),ans=1;
  17. for(int i=1;i<=l;i++) f[i][i]=1;
  18. for(int i=1;i<l;i++)
  19. if(s[i]==s[i+1]) f[i][i+1]=2,ans=2;
  20. for(int len=3;len<=l;len++)
  21. for(int i=1;i+len-1<=l;i++)
  22. {
  23. int j=i+len-1;
  24. if((s[j]==s[i])&&(f[i+1][j-1])) f[i][j]=f[i+1][j-1]+2;
  25. ans=max(ans,f[i][j]);
  26. }
  27. cout<<ans;
  28. return 0;
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/660177
推荐阅读
相关标签
  

闽ICP备14008679号