动态规划_百炼4122 切割回文

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <vector>
 7 #include <map>
 8 #include <queue>
 9 #include <string>
10 #include <iostream>
11 #include <ctype.h>
12 #include <string.h>
13 #include <set>
14 #include <stack>
15 #include<functional>
16 using namespace std;
17 #define size 1001
18 #define maxn  1<<30
19 int dp[size];
20 char a[size];
21 /*dp[i]表示的是将前面i个字符切割回文字串时候需要切多少刀
22 然后将字符串从j处切开,字符串变成了
23 1..j  j+1..i
24 能切割的条件是j+1 到i是回文的
25 */
26 bool isSymmetry(int s, int e){
27     while (a[s] == a[e]&&s<=e){
28         s++, e--;
29     }
30     if (s <= e)  return false;
31     return true;
32 }
33
34 int main(){
35     int T;
36     cin >> T;
37     while (T--){
38         scanf("%s", a + 1);
39         int len = strlen(a+1);
40         for (int i = 1; i <= len; i++){
41             dp[i] = isSymmetry(1, i) ? 0 : i - 1;
42             for (int j = 1; j < i; j++)
43             {
44                 if (isSymmetry(j + 1, i)) dp[i] = min(dp[j] + 1, dp[i]);
45             }
46         }
47         cout << dp[len] << endl;
48     }
49     system("pause");
50     return 0;
51 }

原文地址:https://www.cnblogs.com/MapReduce/p/8366544.html

时间: 2024-07-30 05:05:38

动态规划_百炼4122 切割回文的相关文章

NOI题库 / 2.6基本算法之动态规划 - 8471:切割回文

总时间限制:  1000ms 内存限制:  65536kB 描述 阿福最近对回文串产生了非常浓厚的兴趣. 如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串.例如,"abcaacba"是一个回文串,"abcaaba"则不是一个回文串. 阿福现在强迫症发作,看到什么字符串都想要把它变成回文的.阿福可以通过切割字符串,使得切割完之后得到的子串都是回文的. 现在阿福想知道他最少切割多少次就可以达到目的.例如,对于字符串"abaacca

POJ 8471 切割回文 【dp】【北大ACM/ICPC竞赛训练】

1 #include<iostream> 2 #include<vector> 3 #define INF 100000 4 using namespace std; 5 6 string s; 7 char a[1005]; 8 vector<int> hui[1005];//hui[i]里的k指 k到i组成回文 9 int dp[1005];//dp[i]代表前i个字符要切几刀 10 11 int main(){ 12 int t; cin>>t; 13

动态规划1.求最长回文子串

求字符串的子串大致有四中方法,暴力,DP,中心拓展,马拉车算法,这篇讲DP怎么做. DP最重要的就是要能利用到前面的结果来推断当前状态,比暴力优化的地方就在此,暴力需要对每一个字符串做一次O(n)的操作才能判断出结果,也就是整个过程要O(n^3),但DP对每一个字符串的判断时间是O(1),总共是O(n^2) 假设s=adcdf,我们可以的推导过程就像下图(i代表行,表示结尾,表示字符串结尾,j代表列,表示字符串开头) 1 2 3 4 5 1 a 2 ad d 3 adc dc c 4 adcd

(Manacher Algorithm, 中心拓展法,动态规划) leetcode 5. 最长回文串

解法一:中心拓展法.从下标为0开始遍历,将每个元素当作回文串中心,向两边拓展. 1)以这个字符为中心的回文串的长度(奇数串): 2)以这个字符和下个字符为中心的回文串的长度(偶数串). 注意:既要统计回文串为奇数时,又要统计回文串为偶数时.当 s[left]!=s[right] 时,left多减了1,right多加了1,所以在计算回文串开头时要把left+1,长度要是(right-1)-(left+1)-1 = right - left -1 class Solution { public: s

动态规划_百炼4120 硬币

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 4121 股票买卖

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 1088 滑雪

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼1664 放苹果

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 4117 简单的整数划分问题

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include