简单dp算法——百炼05:切割回文
2016-07-24 09:03
162 查看
05:切割回文
点击打开链接http://bailian.openjudge.cn/2016acm/05/
总时间限制: 1000ms 内存限制: 65536kB描述
阿福最近对回文串产生了非常浓厚的兴趣。
如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串。例如,“abcaacba”是一个回文串,“abcaaba”则不是一个回文串。
阿福现在强迫症发作,看到什么字符串都想要把它变成回文的。阿福可以通过切割字符串,使得切割完之后得到的子串都是回文的。
现在阿福想知道他最少切割多少次就可以达到目的。例如,对于字符串“abaacca”,最少切割一次,就可以得到“aba”和“acca”这两个回文子串。
输入输入的第一行是一个整数 T (T <= 20) ,表示一共有 T 组数据。
接下来的 T 行,每一行都包含了一个长度不超过的 1000 的字符串,且字符串只包含了小写字母。输出对于每组数据,输出一行。该行包含一个整数,表示阿福最少切割的次数,使得切割完得到的子串都是回文的。样例输入
3 abaacca abcd abcba
样例输出
1 3 0
提示对于第一组样例,阿福最少切割 1 次,将原串切割为“aba”和“acca”两个回文子串。
对于第二组样例,阿福最少切割 3 次,将原串切割为“a”、“b”、“c”、“d”这四个回文子串。
对于第三组样例,阿福不需要切割,原串本身就是一个回文串。
解题思路:
dp[len] , s;
先给dp数组赋值(0,1,2.....,len-1),这是最坏的打算,表示长度为len的字符串需要切割ln-1次;
然后从s的第0位到第n位循环判断是否是回文(palindrome):
若是,dp
=0(表示s[0]—s
不需要切割),继续判断0到n+1位是否是回文;
若不是,锁定n,判断从第i=1位到第n位是否为回文:
若是,比较dp[n+1]的值与dp[i]+1的值,选择最小的赋给dp[n+1];
若不是,i++;
温馨提示:解题思路中的下标与代码中的下标有些不一样,这是小龙人给大家的一点小考验,如果你真的理解了,这点小困难不算什么.
代码实现:
#include <iostream> #include <cstdio> #include <queue> #include <vector> #include <map> #include <cmath> using namespace std; string s; bool ispalindrome( int start, int End ) //判断从start到End是否为回文; { int i, j; for( i=0; i<=(End-start)/2; i++ ) { if( s[start+i] != s[End-i]) return false; } return true; } int main() { int t; cin >> t; while( t-- ) { cin >> s; int len = s.length(); int i, j; int dp[1010]; for( i=1; i<=len; i++ ) // 给dp数组做最坏的打算; dp[i] = i - 1; for( i=1; i<=len; i++ ) // 最晕的地方开始了,根据上面的解题思路慢慢体会吧; { if( ispalindrome( 0, i-1 ) ) { dp[i] = 0; continue; } else { for( j=1; j<i; j++ ) { if( ispalindrome( j, i-1 ) ) dp[i] = min( dp[i], dp[j]+1 ); } } } cout << dp[len] << endl; } return 0; }
相关文章推荐
- java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
- maven启动 cannot be cast to javax.servlet.Filter/cannot be cast to javax.servlet.Servlet 报错
- ButterKnife-5.1.2.jar(较低版本的ButterKnife)使用方法
- get last dirname/filename in a file path argument
- netstat命令详解
- [HDU 5729] Rigid Frameworks (二分图联通方案计数)
- ArrayList中的add(index, element)方法分析
- OpenCV+Visual Studio 2010、2012、2013、2015
- 【Coursera】Fourth Week(1)
- CodeForces 616A Comparing Two Long Integers
- Git使用教程
- linux服务器出现大量TIME_WAIT的解决方法
- poj 3468 线段树区间更新
- 防止表单重复提交
- c++
- Prime Ring Problem
- 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程
- hdu 1112
- AT24C512与AT24C512B的区别
- POJ 3620 Avoid The Lakes(DFS)