51nod_1255字典序最小的子序列
作为贪心算法的某道例题,赶脚药丸啊。。这么简单的代码重构第三遍才过。。。
首先是贪心算法思想,
1,证明贪心算法有效性:
贪心策略,使用栈结构实现,遍历输入串中所有元素,对于某个元素有如下两种情况:
情况A:如果栈内已经有该元素,则废弃该元素。
情况B:如果栈内没有该元素,则废弃栈内所有“并非最后一次出现”且字典序大于当该元素的字母,遇到第一个不合法的字母则停止废弃。
对于栈内元素,我们认为任何“不被最后一次出现元素分割”的连续元素都相当按照字典序的相对大小排列整齐。基于此设定,讨论任何一个元素:
情况A:对于任何一个非最后一次出现的元素,如果大于当前元素,意味着该元素可以再后面再出现一次,因此可以废弃。且因为新插入的“当前元素”字典序最小,因而认为“原油序列可以再后面重现”且“任何废弃元素后面可以接的元素,该元素后面都可以接”。所以“如果有最优解,则一定包含最小的元素”
情况B:对于最后一次出现的元素,因为其不可能在后面出现,所以不可以将其废弃,对于该元素前面的元素,因为相对该元素较小,也不可废弃。
PS:注意一个坑,使用某元素出现此时来判断他未来会不会再出现比较好。
show the code:
- #include<bits/stdc++.h>
- using namespace std;
- const long long MAXN=+;
- char str[MAXN];
- int times[];
- set<char> s1;
- stack<int> stack1;
- int main()
- {
- // cin.sync_with_stdio(false);
- memset(times,,sizeof(times));
- cin>>str;
- int len=strlen(str);
- for(int i=;i<len;++i)
- {
- times[str[i]-'a']++;
- }
- for(int i=;i<len;++i)
- {
- char ncha=str[i];
- times[ncha-'a']--;
- if(s1.count(ncha))continue;
- while(!stack1.empty())
- {
- int pos=stack1.top();
- char cha=str[pos];
- if(cha<ncha||times[cha-'a']==)break;
- if(cha>ncha)
- {
- s1.erase(cha);
- stack1.pop();
- }
- }
- s1.insert(ncha);
- stack1.push(i);
- }
- string str1;
- while(!stack1.empty())
- {
- str1.push_back(str[stack1.top()]);
- stack1.pop();
- }
- int len1=str1.length();
- for(int i=len1-;i>=;--i)
- {
- cout<<str1[i];
- }cout<<endl;
- }
51nod_1255字典序最小的子序列的更多相关文章
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- [poj2337]求字典序最小欧拉回路
注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...
- POJ1815 Friendship(字典序最小最小割割边集)
看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...
- poj 1815 Friendship 字典序最小+最小割
题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...
- UVa 1599 (字典序最小的最短路) Ideal Path
题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...
- ZOJ-1456 Minimum Transport Cost---Floyd变形+路径输出字典序最小
题目链接: https://vjudge.net/problem/ZOJ-1456 题目大意: Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有.现在有一些货物要从一个城市运到另一个 ...
- HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】
<题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...
- POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8756 Accepted: 2306 Descript ...
- BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5410 Solved: 1877 [Submit][St ...
随机推荐
- synchronized锁——8锁
前言 多线程是Java面试中最喜欢问的问题之一,有一篇公众号推文内容很详细,推荐看看 但凡面试官考“多线程”,一定会问这10个问题! 本文中仅对synchronized关键字的加锁进行一定分析 一.标 ...
- 7天学完Java基础之2/7
面向对象 面向对象的思想就是值我们要实现一个共功能的时候,我们不自己去做,而是找别人帮我们去做,帮我们去做的这个人就是对象.面向对象强调的是谁来帮我实现这个功能. 类与对象的关系 类:是一组相关属性和 ...
- MVC与MVVM的关系
什么是MVC? M(Model数据层) 职能单一,只负责操作数据库,执行对于的 Sql 语句,进行数据的CRUD C: create 增加 R: Read 读取 U: update 修改 D: Del ...
- HTTP响应报文与工作原理详解(转)
超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...
- Bootstrap插件-carousel(轮播图)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- koa源码分析
最近项目要使用koa,所以提前学习一下,顺便看了koa框架的源码. 注:源码是koa2.x koa的源码很简洁,关键代码只有4个文件,当然还包括一些依赖npm包 const Koa = require ...
- pandas error记录随笔
1.sys:1: DtypeWarning: Columns (0,1) have mixed types. Specify dtype option on import or 解决办法:PANDAS ...
- LeetCode Add Binary 两个二进制数相加
class Solution { public: string addBinary(string a, string b) { if(a==""&&b==" ...
- 兼容ie8的圆形进度条
主要是利用html5中的svg 画出圆形进度条 并且兼容ie8 https://github.com/GainLoss/Circular-progress-bar
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...