CloudLunar
主页
知识库
人文社科
自然科学
跨学科领域
热门分类
算法及题库
云璟月's
墨色集(设计)
指尖集(代码)
未央集(随笔)
流觞集(语录)
如花集(书影)
纸鸢集(小说)
登录
B站
微博
人人
开心
Twitter
Facebook
RSS订阅链接
留言板
关于我
在社交网站上关注我
B站
微博
人人
开心
Twitter
Facebook
RSS订阅
RSS订阅链接
留言板
关于我
查看CodeVS/1576的源代码
←
CodeVS/1576
因为以下原因,你没有权限编辑本页:
你刚才请求的操作只对属于该用户组的用户开放:
用户
您可以查看并复制此页面的源代码:
[[分类:序列动态规划]] ==摘要== {{信息题|最长严格上升子序列|http://www.codevs.cn/problem/1576/|1|100|time=2014/11/04 21:35:54}} ==题意== 求最长严格上升子序列长度。 ==题解== 在[[CodeVS/1044]]说好的,这里好好研究一下怎么愉快地做LIS。 然后- -我就用了map。 LIS的DP方程很容易得到: <pre> f[x]=f[i]+1;(其中1<=i<=x-1,a[i]是最大的小于a[x]的数) </pre> 最朴素的<m>O(n^2)</m>肯定没难度辣,这明显可以用map和upper_bound/lower_bound处理,用法如下: <pre> map<int,int> a;//如果定义作map<int,int, greater<int> >,以下>=、>均替换为<=、< (...) a.lower_bound(3);//获得a中first>=3的第一个指针 a.upper_bound(3);//获得a中first>3的第一个指针 </pre> 于是很容易就用标准库得到答案了。 然后这样的话<del>好没意思</del>不能体现出算法的精妙之处,所以窝还是去百度了下辅助数列的写法,太久没做了真的不是太好想。 原来是首先用一个数组dp专门记录每一次从哪一项转移过来的(就是上述方程中的dp[x]=i),然后可以发现dp是一个递增数列,可以二分查找<ref>http://www.fookwood.com/archives/749</ref>,代码就不写了,二分查找还可以用一下STL中的lower_bound(和map的略有不同): <pre> lower_bound(查找范围开始指针,查找范围结束指针,比较量,比较函数[默认less<数据类型>]) </pre> ==代码== {{折叠|1576.cpp代码已折叠 |<pre>#include<cstdio> #include<map> #include<vector> #include<algorithm> using namespace std; map<int,int,greater<int> > f; int n,a,Ans=0; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a); if(f.upper_bound(a)!=f.end()) f[a]=f.upper_bound(a)->second+1; else f[a]=1; Ans=max(Ans,f[a]); } printf("%d",Ans); } </pre> |code1576}} ==参考资料== <references/>
该页面使用的模板:
模板:信息题
(
查看源代码
)
模板:折叠
(
查看源代码
)
模板:提示框
(
查看源代码
)
模板:警告
(
查看源代码
)
返回
CodeVS/1576
。
著作权声明
[
编辑
]
除非另有说明,本
网站内容
采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可(中国大陆可以参照
知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
,如有不同以前者为准)。
如果需要商业化使用,请另联系作者取得授权。
关于
[
编辑
]
联系
@云璟月Lunar
的新浪微博
本站RSS:
RSS链接