博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip2013花匠
阅读量:4690 次
发布时间:2019-06-09

本文共 1328 字,大约阅读时间需要 4 分钟。

题面

解析

\(O(n^2)\)秒出:

\(f[0][i]\)表示保留第\(i\)个盆,并且它高于左边和右边的方案数。
\(f[1][i]\)表示保留第\(i\)个盆,并且它低于左边和右边的方案数。

int main(){  n=gi();  fp(i,1,n) a[i]=gi();  fp(i,1,n) f[0][i]=f[1][i]=1;  fp(i,2,n)    fp(j,1,i-1)    {      if(a[i]>a[j]) f[0][i]=max(f[0][i],f[1][j]+1),ans=max(ans,f[0][i]);      if(a[i]

然后思考怎么把这个优化成\(O(n)\)

考虑维护\(\max\{f[1][j]+1\}\)\(\max\{f[0][j]+1\}\)
这个东西吗,其实可以从前面继承过来。
因为,即使实际上\(f[0][i]==1\)\(f[0][i-1]==3\),把\(f[0][i]=3\)不会影响到后面\(DP\)的结果,也不会影响到最终的答案。
但是这样\(DP\),取前面的最大值就方便多了。

#include
#include
#include
#include
#include
#include
#include
#define ll long long#define re register#define il inline#define db double#define fp(i,a,b) for(re int i=a;i<=b;++i)#define fq(i,a,b) for(re int i=a;i>=b;--i)using namespace std;const int N=1e5+100;int n,a[N],f[2][N];il ll gi(){ re ll x=0,t=1; re char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') t=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}il int max(re int x,re int y){return x>y?x:y;}int main(){ n=gi(); fp(i,1,n) a[i]=gi(); f[0][1]=f[1][1]=1; fp(i,2,n) { if(a[i]>a[i-1]) f[0][i]=max(f[0][i],f[1][i-1]+1); else f[0][i]=max(f[0][i],f[0][i-1]); if(a[i]

转载于:https://www.cnblogs.com/yanshannan/p/9925139.html

你可能感兴趣的文章
hello world2
查看>>
在子窗口中操作父窗口(刷新)
查看>>
maven insall跳过测试
查看>>
B树 B- B+ B*
查看>>
『算法设计_伪代码』红黑树
查看>>
CentOS 配置RDP
查看>>
简单的触发黑名单阻断演示 control+c
查看>>
Adobe出品(支持IOS,android,web调用)免费插件编辑图片
查看>>
如何恢复windows的exe文件的默认打开方式
查看>>
codewars--js--Convert all the cases!
查看>>
codeforce440C-Maximum splitting-规律题
查看>>
牛客小白月赛8 - E - 诡异数字 数位DP
查看>>
@Autowired还可以注入List和Map
查看>>
004 使用文本编辑器
查看>>
RAID5当一块硬盘离线后处理
查看>>
我的系统备份策略
查看>>
DynamicMBean(Java SE 6 新特性: JMX 与系统管理)
查看>>
杜月笙语录
查看>>
【机友会选手机攻略】合约机是什么?和裸机有什么区别?0元购机和购机入网送话费区别?...
查看>>
Nginx配置一个自签名的SSL证书
查看>>