zoj2859
来源:互联网 发布:高清数字矩阵 编辑:程序博客网 时间:2024/05/21 14:53
第一种算法
rmq
参考http://blog.sina.com.cn/s/blog_88705ca20100ufl2.html
#include<iostream>#include<stdio.h>#include<string.h>#include<limits.h>#include<cmath>#include<algorithm>#define MAX 301using namespace std;int dp[MAX][MAX][9][9];int matrix[MAX][MAX];void build(int n){ int i,j,k; int c,r; for(i=1;i<=n;i++) for(j=1;j<=n;j++) dp[i][j][0][0]=matrix[i][j]; int m=log(double(n))/log(2.0); for(i=0;i<=m;i++) for(j=0;j<=m;j++) { if(i==0&&j==0)continue; for(r=1;r+(1<<i)-1<=n;r++) { for(c=1;c+(1<<j)-1<=n;c++) { if(i==0) { dp[r][c][i][j]=min(dp[r][c][i][j-1],dp[r][c+(1<<(j-1))][i][j-1]); } else { dp[r][c][i][j]=min(dp[r][c][i-1][j],dp[r+(1<<(i-1))][c][i-1][j]); } } } }}int get(int x1,int y1,int x2,int y2){ int l1=x2-x1+1; int l2=y2-y1+1; l1=log(double(l1))/log(2.0); l2=log(double(l2))/log(2.0); int m1=dp[x1][y1][l1][l2]; int m2=dp[x2-(1<<l1)+1][y1][l1][l2]; int m3=dp[x1][y2-(1<<l2)+1][l1][l2]; int m4=dp[x2-(1<<l1)+1][y2-(1<<l2)+1][l1][l2]; return min(min(m1,m2),min(m3,m4));}int main(){ int t,n,m,i,j; int x1,y1,x2,y2; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&matrix[i][j]); build(n); scanf("%d",&m); while(m--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); printf("%d\n",get(x1,y1,x2,y2)); } }}
- zoj2859
- 二维rmq zoj2859
- ZOJ2859-----二维的RMQ
- ZOJ2859 Matrix Searching 二维RMQ问题
- Weka开发——REPTree源代码分析
- 基于Node.js服务器的WebSocket Video
- 操作系统实验-内存管理
- poj 3321
- 1153.马周游问题
- zoj2859
- [Usaco2008 Oct]灌水 最小生成树
- 致Emacs初学者+Emacs初学者必知必会
- power Designer 简单应用
- 使用集成块DIY计算机
- 流量的烦恼
- php ghook 全局钩子功能 v0
- MFC中PreTranslateMessage函数浅析
- linux shell编程之菜单选择(一)