解题思路

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 提高组] 花匠相关推荐

  1. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

    [题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...

  2. 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头

    [题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...

  3. 信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开

    [题目链接] ybt 1848:[07NOIP提高组]字符串的展开 OpenJudge NOI 1.7 35:字符串的展开 洛谷 P1098 [NOIP2007 提高组] 字符串的展开 [题目考点] ...

  4. 信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者

    [题目链接] ybt 1855:[09NOIP提高组]潜伏者 OpenJudge NOI 1.7 11:潜伏者 洛谷 P1071 [NOIP2009 提高组] 潜伏者 [题目考点] 1. 字符串 2. ...

  5. 信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换

    [题目链接] ybt 1820:[00NOIP提高组]进制转换 洛谷 P1017 [NOIP2000 提高组] 进制转换 注意:两OJ上题目内容相同,输入输出要求不同 [题目考点] 1.数制 [解题思 ...

  6. 信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金

    [题目链接] ybt 1839:[05NOIP提高组]谁拿了最多奖学金 OpenJudge NOI 1.9 04:谁拿了最多奖学金 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金 [ ...

  7. 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题

    [题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...

  8. 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值

    [题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...

  9. 信息学奥赛一本通 1118:铺地毯 | 1863:【11NOIP提高组】铺地毯 | OpenJudge NOI 1.9 14 | 洛谷 P1003 [NOIP2011 提高组] 铺地毯

    [题目链接] ybt 1118:铺地毯 ybt 1863:[11NOIP提高组]铺地毯 OpenJudge NOI 1.9 14:铺地毯 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [题目 ...

  10. 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙

    [题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...

最新文章

  1. 突破微信小程序五层层级限制的解决方案
  2. excel中会计专用格式问题_解决方法
  3. CALayer 了解与使用
  4. ThinkPHP调用连连支付
  5. 让 Python 代码运行更快的最佳方式!
  6. 市场定位和硬件设计的错误-浅谈GM8126的封装
  7. qt 消息处理机制与window消息处理机制的比较
  8. Infinispan版本已映射到最低Java版本
  9. idft重建图像 matlab_利用 MATLAB 编程,打开一幅图像,对其进行 DFT 变换,并置其不同区域内的系数为零,进行 IDFT ,观察其输出效果。_学小易找答案...
  10. 仅展示近三天的动态设置_不要把朋友圈设置成3天可见……
  11. JavaScript中的[]和{}
  12. 华为机试在线训练|解题记录|HJ01-103
  13. DBN深度置信网络的实现
  14. C语言链表详解(通俗易懂)
  15. 阿里云DKMS对接记录
  16. easyui 如何添加事件
  17. 学习Python会用到的8个软件,你用的哪些
  18. week9 day4 CSS网页布局
  19. 时空大数据解决方案-最新全套文件
  20. 如何评小学计算机课,小学信息技术优质课评选听课心得体会

热门文章

  1. 前端JS请求网络图片报错GET https://xxx.png 404 (Not Found)的解决办法
  2. 验证手机号是否注册过爱奇艺
  3. ubuntu16.04调试5G模组ZM9000
  4. 智能电视应用适配指南
  5. Android电视清理系统应用,智能电视删除自带软件,这个方法最简单!
  6. mysql查看备份文件_MySQL的备份与还原以及常用数据库查看命令
  7. MySQL-第七章-xtrabackup(XBK)工具使用
  8. vue3.0清理定时器无效问题
  9. 湖盟知识—***、病毒、防火墙
  10. NVT SDK开关机LOGO替换实践