【洛谷 P1970】 [NOIP2013 提高组] 花匠
解题思路
70分:
很明显的一个线性DP
#include<bits/stdc++.h>
using namespace std;int n,a[100010],f[100010][3],ans;int main(){// freopen("flower.in","r",stdin);//freopen("flower.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);f[i][1]=f[i][2]=1;}for(int i=1;i<=n;i++){for(int j=1;j<i;j++){if(a[i]<a[j])f[i][2]=max(f[i][2],f[j][1]+1);if(a[i]>a[j])f[i][1]=max(f[i][1],f[j][2]+1);ans=max(ans,max(f[i][2],f[i][1]));}}printf("%d",ans);
}
100分:
注意到第二个for是找最大值,考虑用树状数组优化。
f[i][1]表示以a[i]结尾,a[i]为最大值时,最大株数
f[i][2]表示以a[i]结尾,a[i]为最小值时,最大株数
tree[a[i]][1]表示前一个比当前高的花高度为a[i]时,已有的大株数
tree[a[i]][2]表示前一个比当前矮的花高度为a[i]时,已有的最大株数
则
int find2(int x){int ans=0;for(int i=x;i>0;i-=i&(-i)){ans=max(tree[i][2],ans);}return ans;
}int find1(int x){int ans=0;for(int i=x;i<=maxn;i+=i&(-i)){ans=max(tree[i][1],ans);}return ans;
}
f[i][2]=max(f[i][2],find1(a[i]+1)+1);
f[i][1]=max(f[i][1],find2(a[i]-1)+1);
得到f[i][1,]f[i][2]后跟新tree[a[i]][1],tree[a[i]][2]
for(int i=x;i>0;i-=i&(-i))//注意这里不是x~maxn因为f[i][2]更新时要从a[i]+1~maxn中找tree[x][1]最大的,所以后面的更高要被前面矮的更新tree[i][1]=max(tree[i][1],v);for(int i=x;i<=maxn;i+=i&(-i))tree[i][2]=max(tree[i][2],v);
代码
#include<bits/stdc++.h>
using namespace std;int n,anss,maxn,a[100010],f[100010][3];
int tree[1000010][3];void add1(int x,int v){for(int i=x;i>0;i-=i&(-i))tree[i][1]=max(tree[i][1],v);
}void add2(int x,int v){for(int i=x;i<=maxn;i+=i&(-i))tree[i][2]=max(tree[i][2],v);}int find2(int x){int ans=0;for(int i=x;i>0;i-=i&(-i)){ans=max(tree[i][2],ans);}return ans;
}int find1(int x){int ans=0;for(int i=x;i<=maxn;i+=i&(-i)){ans=max(tree[i][1],ans);}return ans;
}int main(){freopen("flower.in","r",stdin);freopen("flower.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i]=a[i]+1;maxn=max(maxn,a[i]);f[i][1]=f[i][2]=1;}for(int i=1;i<=n;i++){ f[i][2]=max(f[i][2],find1(a[i]+1)+1);f[i][1]=max(f[i][1],find2(a[i]-1)+1); add2(a[i],f[i][2]); add1(a[i],f[i][1]);anss=max(anss,max(f[i][2],f[i][1]));}printf("%d",anss);
}
/*
11
1 2 3 4 4 3 2 5 5 6 5
*/
【洛谷 P1970】 [NOIP2013 提高组] 花匠相关推荐
- 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案
[题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...
- 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头
[题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...
- 信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
[题目链接] ybt 1848:[07NOIP提高组]字符串的展开 OpenJudge NOI 1.7 35:字符串的展开 洛谷 P1098 [NOIP2007 提高组] 字符串的展开 [题目考点] ...
- 信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者
[题目链接] ybt 1855:[09NOIP提高组]潜伏者 OpenJudge NOI 1.7 11:潜伏者 洛谷 P1071 [NOIP2009 提高组] 潜伏者 [题目考点] 1. 字符串 2. ...
- 信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换
[题目链接] ybt 1820:[00NOIP提高组]进制转换 洛谷 P1017 [NOIP2000 提高组] 进制转换 注意:两OJ上题目内容相同,输入输出要求不同 [题目考点] 1.数制 [解题思 ...
- 信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
[题目链接] ybt 1839:[05NOIP提高组]谁拿了最多奖学金 OpenJudge NOI 1.9 04:谁拿了最多奖学金 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金 [ ...
- 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题
[题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...
- 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值
[题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...
- 信息学奥赛一本通 1118:铺地毯 | 1863:【11NOIP提高组】铺地毯 | OpenJudge NOI 1.9 14 | 洛谷 P1003 [NOIP2011 提高组] 铺地毯
[题目链接] ybt 1118:铺地毯 ybt 1863:[11NOIP提高组]铺地毯 OpenJudge NOI 1.9 14:铺地毯 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [题目 ...
- 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙
[题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...
最新文章
- 突破微信小程序五层层级限制的解决方案
- excel中会计专用格式问题_解决方法
- CALayer 了解与使用
- ThinkPHP调用连连支付
- 让 Python 代码运行更快的最佳方式!
- 市场定位和硬件设计的错误-浅谈GM8126的封装
- qt 消息处理机制与window消息处理机制的比较
- Infinispan版本已映射到最低Java版本
- idft重建图像 matlab_利用 MATLAB 编程,打开一幅图像,对其进行 DFT 变换,并置其不同区域内的系数为零,进行 IDFT ,观察其输出效果。_学小易找答案...
- 仅展示近三天的动态设置_不要把朋友圈设置成3天可见……
- JavaScript中的[]和{}
- 华为机试在线训练|解题记录|HJ01-103
- DBN深度置信网络的实现
- C语言链表详解(通俗易懂)
- 阿里云DKMS对接记录
- easyui 如何添加事件
- 学习Python会用到的8个软件,你用的哪些
- week9 day4 CSS网页布局
- 时空大数据解决方案-最新全套文件
- 如何评小学计算机课,小学信息技术优质课评选听课心得体会
热门文章
- 前端JS请求网络图片报错GET https://xxx.png 404 (Not Found)的解决办法
- 验证手机号是否注册过爱奇艺
- ubuntu16.04调试5G模组ZM9000
- 智能电视应用适配指南
- Android电视清理系统应用,智能电视删除自带软件,这个方法最简单!
- mysql查看备份文件_MySQL的备份与还原以及常用数据库查看命令
- MySQL-第七章-xtrabackup(XBK)工具使用
- vue3.0清理定时器无效问题
- 湖盟知识—***、病毒、防火墙
- NVT SDK开关机LOGO替换实践