作为贪心算法的某道例题,赶脚药丸啊。。这么简单的代码重构第三遍才过。。。

首先是贪心算法思想,

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字典序最小的子序列的更多相关文章

  1. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  2. [poj2337]求字典序最小欧拉回路

    注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...

  3. POJ1815 Friendship(字典序最小最小割割边集)

    看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...

  4. poj 1815 Friendship 字典序最小+最小割

    题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...

  5. UVa 1599 (字典序最小的最短路) Ideal Path

    题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...

  6. ZOJ-1456 Minimum Transport Cost---Floyd变形+路径输出字典序最小

    题目链接: https://vjudge.net/problem/ZOJ-1456 题目大意: Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有.现在有一些货物要从一个城市运到另一个 ...

  7. HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】

    <题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...

  8. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...

  9. BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5410  Solved: 1877 [Submit][St ...

随机推荐

  1. Emgu CV 初试

    Emgu CV 是.NET平台下对OpenCV图像处理库的封装,也就是.NET版.可以运行在C#.VB.VC++等. 安装完成后需要设置环境变量,比如我安装在D:\Emgu\emgucv-window ...

  2. selenium+phantomjs报错:Unable to find a free port的分析和解决

    selenium+phantomjs报错:Unable to find a free port的分析和解决 Table of Contents 1. 现象 2. 分析 3. 解决办法 1 现象 在做项 ...

  3. 从零开始的全栈工程师——js篇2.13(案例存放:三重数组渲染)

  4. return false;和e.preventDefault;和e.stopPropagation的区别

    因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是 stopPropagati ...

  5. HTTP响应报文与工作原理详解(转)

    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...

  6. MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析

    MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...

  7. 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化

    本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...

  8. javascript设计模式之中介者模式

    /* * 小游戏演示中介者模式 * Home 按键 1 * Guest 按键 0 * 半分钟内看谁按下的次数多 * * 参与的对象: * 玩家 * 计分板 * 中介者 * * 中介者模式使对象之间松耦 ...

  9. char*、string、CString各种字符串之间转换

    参考博客: http://blog.csdn.net/luoweifu/article/details/20242307 http://blog.csdn.net/luoweifu/article/d ...

  10. PHP中MySQL数据库连接,数据读写,修改方法

    MySQL连接大的来说有两种方法,一种是mysqli,另一种是mysql.php为连接MySQL提供了函数库,有mysql和mysqli,mysqli是mysql函数库的扩展,是php5才支持的.当你 ...