题目链接:http://acm.swust.edu.cn/problem/585/ Time limit(ms): 3000 Memory limit(kb): 65535   SWUST国的一支科学考察队到达了举世闻名的古埃及金字塔. 关于金字塔的建造一直是一个未解之谜, 有着“西方史学之父”之称的希罗多德认为,金字塔的建造是人力和牲畜,花费20 年时间从西奈半岛挖掘天然的石头运送到埃及堆砌而成.也有不少人认为是外星人修建的.人们发现胡夫金字塔的经线把地球分成东.西两个半球,它们的陆地面积是相…
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写的0≤Ai≤9 (i=1,2,⋯,n).就知道肯定有点东西,只要这么写,肯定就是有某个神奇的操作可以解决这道题目. 比赛的时候脑壳都要炸了也没想出来,补题的时候懂了,我可以定义一个b串为0123456789,这肯定是递增的,所以我翻转b的某个区间,然后去和a匹配,因为我把b再翻转回来,还是递增的.…
现在n(<=20000)个俄罗斯套娃,每个都有宽度wi和高度hi(均小于10000),要求w1<w2并且h1<h2的时候才可以合并,问最少能剩几个. [LIS]乍一看跟[这题]类似,但是仔细看是有区别的,其实就相当于上一题多次求LIS,每次求完LIS后把得到的序列删去,然后重新求LIS,最后输出求LIS的次数,我一开始这样写,果然就TLE了.还是要另辟蹊径. 首先用贪心思想,先按照wi从大到小排序,wi相等的情况下hi从小到大,然后求最长不下降子序列(注意可以等于).输出其长度即可. 想…
最长不降子序列是这样一个问题: 下面介绍动态规划的做法. 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度.这样对 A[i] 来说就会有两种可能: 如果存在 A[i] 之前的元素 A[j] (j<i),使得 A[j]≤A[i] 且 dp[j]+1>dp[i],那么就把 A[i] 跟在以 A[j] 结尾的 LIS 后面,形成一条更长的不下降子序列(令 dp[i]=dp[j]+1). 如果 A[i] 之前的元素都比 A[i] 大,那么 A[i] 就只好自己形成一条 LIS,但是长度为 1…
分析: 完整 代码: // 最长不下降子序列 #include <stdio.h> #include <algorithm> using namespace std; ; int A[N], dp[N]; int main() { freopen("in.txt", "r", stdin); int n; scanf("%d", &n); ; i <= n; i++){ scanf("%d"…
先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还有本文涉及的树状数组维护后的O(nlogn)算法*. 再贴一个容易理解的树状数组算法:https://www.cnblogs.com/war1111/p/7682228.html 再看看这道题 原题链接:http://acm.hnucm.edu.cn/JudgeOnline/problem.php?…
最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i-) ); } DP是O(n^2)的,我感觉已经不错了不过还有超碉的nlogn的方法. nlogn的方法: 用栈和二分查找. 遇到一个元素a[i],若它不小于栈顶s[top],直接入栈:若小于栈顶,则在栈中二分查找,用它替换栈中比它大的第一个元素.最终栈的大小就是最长不下降子序列的长度(栈中元素并不…
1674: 入侵与反击 时间限制: 1 Sec  内存限制: 128 MB提交: 229  解决: 28[提交][状态][讨论版] 题目描述 A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的拦截导弹的飞行高度都将只能小于等于上一枚导弹的飞行高度,第一次发射的拦截导弹的飞行高度可以看作是足够大.对于A国,这是一件很严重的问题,这意味着A国的防空系统面临空前危机. 通过对A国的军事部门计算机的入侵,A国还不知道敌对国B国刚才已经发现了这项BUG.更不知道,在这项BUG的报告书上交到B国空军…
一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i>j.然后在lis[]中找到最大的一个值,时间复杂度是O(n^2). 代码实现: int Longest_Increasing(int num[],int n){ int lis[n],i,j; for(i=0;i<n;i++){ lis[i]=1; for(j=0;j<i;j++) if(nu…
从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后,得到题目所求的双端队列的最长不下降子序列. 注意要去重,当发生替换之后,同种元素在两个序列中的数量不同.为得到最长序列,当然是把少的去掉,留下多的. 5 2 1 2 2 3 #include<stdio.h> #include<cstring> #include<vector&…