zoj 2744 Palindromes

来源:互联网 发布:洛杉矶快船知乎 编辑:程序博客网 时间:2024/06/05 03:31
//这题主要是找回文字符串的个数,可以用DP来做(贴一下别人的代码,学习学习),也可以用分治方法做!//下面是参照别人的代码再自己实现的,因为之前接触的比较少,所以还不是很熟悉这些题的做法!//希望可以学到东西!#include "iostream"#include "string"using namespace std;string s;int len, count;void is_palindromes(int i, int j){if (s[i] == s[j]){count++;while (--i >= 0 && ++j < len){if (s[i] == s[j])count++;elsereturn;}}}int main(){int i, j;while (cin >> s){len = s.length();count = 0;for (i = 1; i <= 2; i++)//分两种情况来查找是否有回文字符串,一种是相邻,一种是间隔!for (j = 0; j < len-i; j++){is_palindromes(j, j+i);}count += len;//单个字符也是回文字符串,所以需要加上原来字符串的长度!cout << count << endl;s.clear();}}//下面是DP的做法!/*首先说下DP方法,其实碰到这种具有很多重复计算的子问题的问题,很容易想到动态规划DP。对于这个问题可以这样理解:每次都从下标0开始搜索长度依次为2、3、……、n的子串,长度为1的子串肯定是回文。所以可以设立数组bool dp[n][n],其中dp[i][i]=true,dp[i][j]表示字符串中从i到j的子串是否是回文,这样对于上面的搜索过程,要判断str[i-j]要是否回文,可以分为两种情况:1.      i和j之间没有其它字符,所以只要str[i]==str[j]即可。2.      i和j之间还有其它的字符,则要求str[i]==str[j]并且dp[i+1][j-1]=true。这也很好理解,从i+1到j-1的子串是回文,再两端加上相同的字符,肯定也是回文。*///#include <cstdio>//#include <cstdlib>//#include <iostream>//#include <cstring>//using namespace std;////char s[5001];//bool dp[5001][5001];////int main(void)//{//    int i, j;//    int len;//    int cnt;//    int k;//    while(gets(s))//    {//        len = strlen(s);//        cnt = len;//        for (i = 0; i < len; ++i)//        {//            dp[i][i] = 0;//        }//        for (i = 1; i < len; ++i)//        {//            for (j = 0; j < len-i; ++j)//            {//                k = i+j;//                dp[j][k] = false;//                if (s[j] == s[k])//                {//                    if (j+1 < k-1)//                    {//                        if (dp[j+1][k-1])//                        {//                            dp[j][k] = true;//                            ++cnt;//                        }//                    }//                    else//                    {//                        dp[j][k] = true;//                        ++cnt;//                    }//                }//            }//        }//        printf("%d\n", cnt);//    }//    return 0;//}

原创粉丝点击