栈和表达式题目讲解2
1.山峰
题目:
Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。每个山峰的高度都是不一样的。编号为i的山峰高度为\(h_i\)。
小修从西往东登山。每到一座山峰,她就回头观望自己走过的艰辛历程。在第i座山峰,她记录下自己回头能看到的山峰数\(s_i\)。
何谓“能看到”?如果在第i座山峰,存在\(j<k<i,h_j<h_k\),那么第j座山峰就是不可见的。除了不可见的山峰,其余的山峰都是可见的。
回家之后,小修把所有的\(s_i\)加起来得到S作为她此次旅行快乐值。现在n座山峰的高度都提供给你了,你能计算出小修的快乐值吗?
题目条件:
1.\(1<=n<=15000\)。
2.第\(i+1\)行输入一个整数\(h_i\),\(h_i\)<=\(10^9\)。
分析:
我们要维持一个单调递减的栈,i从1开始每次放入第第i座山峰的高度,并依次比较,删除高度小于\(h_i\)的山峰,每次答案就加上此时栈内的元素个数。
2.接龙游戏
题目:
给出了N个单词,如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
你的任务是:对于输入的单词,找出最长的龙。
题目条件:
1.\(1<=N<=10^5\)。
2.输入数据已按照长度从小到大排序,每个单词长度小于50。
分析:
由于要让上一个单词为下一个单词的前缀,我们只需要按字典序排序,保证以一个单词为开头时一定会得到最优情况,并且每次需要记录下最优答案。还有每次单词进栈是要与原来栈顶的单词进行比较,程序已经在开头记录了最优答案,只需要把栈里所有不是新加入单词的前缀单词删除即可。

浙公网安备 33010602011771号