bzoj 3831 Little Bird (单调队列优化dp)
2016-07-25 19:21
344 查看
/*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 using namespace std; int n,k,h[maxn],f[maxn],Q; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&h[i]); scanf("%d",&Q); while(Q--) { scanf("%d",&k); memset(f,127/3,sizeof(f)); f[1]=0; for(int i=1;i<=n;i++) for(int j=i-k;j<i;j++) { if(j<=0)continue; if(h[i]>=h[j])f[i]=min(f[i],f[j]+1); if(h[i]<h[j])f[i]=min(f[i],f[j]); } printf("%d\n",f ); } return 0; }
/* 对于每次的查找最小值 用单调队列维护 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 using namespace std; int n,k,h[maxn],f[maxn],Q,q[maxn],head,tail; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&h[i]); scanf("%d",&Q); while(Q--) { head=1;tail=0; scanf("%d",&k); f[1]=0;q[++tail]=1; for(int i=2;i<=n;i++) { while(tail>=head&&i-q[head]>k)head++; if(h[i]>=h[q[head]])f[i]=f[q[head]]+1; else f[i]=f[q[head]]; while(head<=tail&&f[i]<=f[q[tail]]) { if(f[i]==f[q[tail]]&&h[i]<h[q[tail]])break; tail--; } q[++tail]=i; } printf("%d\n",f ); } return 0; }
相关文章推荐
- 深入C#判断操作系统类型的总结详解(转载)
- 剖析Android 线性布局中的权重(layout_weight)(解答疑惑)
- 快速幂算法
- android的 Notification(通知对象)详解
- easyui combo选中事件
- 中文 Uncode 编码范围
- weblogic 10 及以后版本需要单独生成Weblogic10.3客户端jar文件
- 【HDU】5728 PowMod
- Java实现对中文字符串的排序功能实例代码
- hdu 3530 Subsequence
- Fiddler 使用备忘
- mac下使用owncloud搭建私有云存储 mac owncloud
- 2016年7月25日----总结(键盘点击事件、判断系统版本)
- 算法导论习题2-4 Inversions 逆序数
- jstl标签c:choose
- maven搭建java ee项目图文教程
- POJ-2935 Basic Wall Maze
- Failed to place enough replicas, still in need of 1 to reach 3. For more information。。。。
- <mvc:annotation-driven />注解意义
- hdu-5749 Colmerauer(单调栈)