字符串划分(DP+字符串处理)
来源:互联网 发布:联通网络客服电话 编辑:程序博客网 时间:2024/06/12 04:01
【问题描述】
给你一串由小写字母组成的字符串, 希望你把它划分成一些小段,/span>中的字母都不相同, 并且希望分的段数尽量少。
然后, 把这些小段按字典序排序后输出, 中间由一个空格分隔。
例如: 字符串"nnsmpmn", 最少分成 3 小段: "n", "nsmp","mn"。
排序后输出:
mn n nsmp
注意, 有时候符合上面要求的方案可能有多个, 就要输出排序后字典序最小的那个。
例如: 字符串”aba”可以有2 钟划分: a/ba 和 ab/a, 排序后分别是:”a ba”和”a ab”。
应该输出:
a ab
【 输入格式】
(多组数据形式)
第1 行: 一个不超过 10 的正整数 K, 表示有K 组任务。
第2~K 行, 每行一个由小写字母组成的字符串。 字符串长度范围为[1,50]。
【 输出格式】
按输入次序输出答案。
给你一串由小写字母组成的字符串, 希望你把它划分成一些小段,/span>中的字母都不相同, 并且希望分的段数尽量少。
然后, 把这些小段按字典序排序后输出, 中间由一个空格分隔。
例如: 字符串"nnsmpmn", 最少分成 3 小段: "n", "nsmp","mn"。
排序后输出:
mn n nsmp
注意, 有时候符合上面要求的方案可能有多个, 就要输出排序后字典序最小的那个。
例如: 字符串”aba”可以有2 钟划分: a/ba 和 ab/a, 排序后分别是:”a ba”和”a ab”。
应该输出:
a ab
【 输入格式】
(多组数据形式)
第1 行: 一个不超过 10 的正整数 K, 表示有K 组任务。
第2~K 行, 每行一个由小写字母组成的字符串。 字符串长度范围为[1,50]。
【 输出格式】
按输入次序输出答案。
【 输入输出样例】
数据量不大,开始的时候觉得顺着搜一遍再倒着搜一遍就可以求出,发现不太对
正确的方法是DP。
p[i]表示的是第0-i个字母的最优解,用vector<string>来存,不难,自己能力问题
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>using namespace std;#define MAXN (50+5)#define Set(a, v) memset(a, v, sizeof(a))#define For(i, a, b) for(int i = a; i <= (int)b; i++)#define Forr(i, a, b) for(int i = a; i >= b; i--)#define pb push_backstring s;char S[MAXN];vector<string> p[MAXN], tmp;int c[200];int main(){freopen("string.in", "r", stdin);freopen("string.out", "w", stdout);int T;scanf("%d", &T);while(T--){cin>>s;int slen = s.length()-1;For(i, 0, slen) p[i].clear();S[0] = s[0]; S[1] = '\0';p[0].pb(string(S));For(i, 1, slen){Set(c, 0);Forr(j, i, 0){ if(c[s[j]]++) break; For(u, j, i) S[u-j] = s[u]; S[i-j+1] = '\0'; if(!p[i].size() || !j || p[i].size() > p[j-1].size()+1){ if(j) p[i] = p[j-1]; else p[i].clear(); p[i].pb(string(S));sort(p[i].begin(), p[i].end());}else if(p[i].size() == p[j-1].size()+1){tmp = p[j-1];tmp.pb(S);sort(tmp.begin(), tmp.end());For(k, 0, p[i].size()-1) if(p[i][k] > tmp[k]){ p[i] = tmp; break; }else if(p[i][k] < tmp[k]) break;}}}cout<<p[slen][0];For(j, 1, p[slen].size()-1) cout<<' '<<p[slen][j];printf("\n");}return 0;}
1 0
- 字符串划分(DP+字符串处理)
- 字符串划分
- Vijos P1118 统计单词个数(动态规划,划分型DP,字符串)
- 【codevs1040】【01NOIPTG】统计单词个数,字符串的划分DP
- 划分字符串为字符串数组
- POJ 3267-The Cow Lexicon(DP处理字符串)
- 九度OJ 1260:珍珠项链 (字符串处理、DP)
- 杭电acm 1159Common Subsequence(字符串处理+dp)
- A DP Problem (字符串处理+模拟)
- 按字节划分字符串
- strDivide2.cpp字符串划分
- bzoj 2121: 字符串游戏 (字符串dp)
- bzoj 2121 字符串游戏(字符串dp)
- 字符串DP
- 字符串dp。
- DP字符串
- DP+字符串
- DP+字符串
- 屏幕单位转换dp、px、sp
- (细节题)[LeetCode]Remove Element
- mysql5.7 奇葩问题
- 百战经典之-BitmapFactory.Options对资源图片进行压缩
- leetcode 124.Binary Tree Maximum Path Sum
- 字符串划分(DP+字符串处理)
- 有关字符编码的那些前世今生
- 位置和地图
- Windows下无损分区
- 第六周 项目6-停车场模拟
- 电路设计_铝电解电容的失效原因
- 谁指导下这个用安卓开发怎么做
- 计算广告学方向概述
- Activity的声明周期和启动模式