首页 > 其他分享 >矩阵最值

矩阵最值

时间:2023-08-15 20:33:54浏览次数:41  
标签:11 int 最大值 矩阵 2h 最值 2k

题目描述

我们有一个N  行  M列的矩阵,现在小Q有 K 个问题,每次询问一个以 (X1,Y1)为左上角, (X2,Y2)为右下角的子矩阵的最大值。

输入格式

第一行三个整数 N,M,K 。

接下来 N 行,每行有  M个整数,设Ai,j  为矩阵 i 行j  列的数字。

接下来 k 行,每行 4 个整数  X1,Y1,X2,Y2

输出格式

共 k 行,每行对应一个答案。

样例

样例输入

3 4 5
789 15225 27847 6452 
3976 18268 23626 1943 
13336 26216 17321 4960 
2 2 3 4
2 3 3 4
2 1 3 4
1 3 2 4
1 2 3 2

样例输出

26216
23626
26216
27847
26216

数据范围

对于  的数据,1<=N,M<=250,1<=K<=1E6,1<=X1<=X2<=N,1<=Y1<=Y2<=M。

     提示

 求左上角为(1,1)右下角为(11,11)区域的最大值F(1,1,11,11),可以从图中4个小区域的最大值求最大得到

F(1,1,11,11)=max{F(1,1,8,8),F(1,3,8,11),F(3,1,8,8),F(3,3,11,11)}

1)我们改用倍增思想,预处理所有长宽是2的若干次幂的矩形区域的最大值:

设F[i,j,k,h]表示左上角为(i,j)长度为2k  高度为2h,的矩形区域的最大值。

F[i,j,k,h]=max{ F[i,j,k-1,h],F[i+2k-1,j,k-1,h],F[i,j,k,h-1],F[i,j+2h-1,k,h-1]  }

2)询问一个以 (X1,Y1)为左上角, (X2,Y2)为右下角的子矩阵的最大值时,

k=log[x2-x1+1]

h=log[y2-y1+1]

ans=max{f[x1,y1,k,h],f[x2-2k+1,y1,k,h],f[x1,y2-2h+1,k,h],f[x2-2k+1,y2-2h+1,k,h]}

   
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 
 5 // 快读 
 6 int read(){
 7     int x = 0, f = 1;char c = getchar();
 8     while(c < '0' || c > '9'){if(c == '-'){f = -1;}c = getchar();}
 9     while(c >= '0' && c <= '9'){x = x*10+c-'0';c = getchar();}
10     return x*f;
11 }
12 //快写
13 inline void write(int x){
14     if(x<0) { putchar('-'); x = -x;}
15     if(x>9) write(x / 10);
16     putchar(x % 10 + '0');
17 }
18 
19 
20 const int N = 255;
21 const int M = 255;
22 int dp[N][M][20][20],logn[N];
23 
24 int n,m,q;
25 void rmq_init() //关键是递推的顺序 
26 {
27     
28     for(int k=0;k<=logn[n];k++)
29         for(int h=0;h<=logn[m];h++){
30             if(!k&&!h) continue;        
31             for(int i=1;i+(1<<k)-1<=n;i++)
32             for(int j=1;j+(1<<h)-1<=m;j++)
33                     if(k)
34                         dp[i][j][k][h]=max(dp[i][j][k-1][h],dp[i+(1<<(k-1))][j][k-1][h]);
35                     else
36                         dp[i][j][k][h]=max(dp[i][j][k][h-1],dp[i][j+(1<<(h-1))][k][h-1]);
37            }    
38 }
39 
40 int rmq_q(int x1,int y1,int x2,int y2)
41 {
42     int k=logn[x2-x1+1],h=logn[y2-y1+1];
43     int max1=max(dp[x1][y1][k][h],dp[x2-(1<<k)+1][y1][k][h]);
44     int max2=max(dp[x1][y2-(1<<h)+1][k][h],dp[x2-(1<<k)+1][y2-(1<<h)+1][k][h]);
45     return max(max1,max2);
46 }
47 
48 int main(){
49     n=read();m=read();q=read();//输入数据总数
50     
51     logn[0]=-1;
52     for(int i=1;i<=max(n,m);i++) 
53         logn[i]=logn[i/2]+1;
54     
55     for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j][0][0]=read();
56     
57     rmq_init();//预处理
58     
59     //cin>>m;//输入询问次数q
60     for(int i=1;i<=q;i++)
61         {   
62             int x1=read(),y1=read(),x2=read(),y2=read(); 
63             int ans=rmq_q(x1,y1,x2,y2);
64             write(ans);putchar('\n');
65             
66         }
67         
68     return 0;
69 }

 

     

标签:11,int,最大值,矩阵,2h,最值,2k
From: https://www.cnblogs.com/flatte/p/17630359.html

相关文章

  • hdu 4291(矩阵快速幂+循环节)
    AShortproblemTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):2487    AcceptedSubmission(s):876ProblemDescriptionAccordingtoaresearch,VIMuserstendtohaveshorterfing......
  • CUDA之矩阵转置(全局内存、共享内存)
    使用全局内存完整代码链接A合并访问、B非合并访问#ifdefUSE_DPtypedefdoublereal;#elsetypedeffloatreal;#endif__global__voidtranspose1(constreal*A,real*B,constintN){constintnx=blockIdx.x*blockDim.x+threadIdx.x;const......
  • 54. 螺旋矩阵
    54.螺旋矩阵classSolution{publicList<Integer>spiralOrder(int[][]matrix){List<Integer>list=newArrayList<>();if(matrix==null||matrix.length==0||matrix[0].length==0){returnlist;......
  • 2024年秋招赛码网刷题-判断奇偶数、读取未给出行列数的矩阵
    1defis_even(n):2return1ifn%2==0else034n=int(input())56result=is_even(n)7print(result)#最后一行不能用return因为return只能在函数内部使用。在顶层代码中用return不合法 ......
  • 剑指 Offer 12. 矩阵中的路径
    力扣官方解法:classSolution{public:boolexist(vector<vector<char>>&board,stringword){inth=board.size(),w=board[0].size();vector<vector<int>>visited(h,vector<int>(w));for(inti=0......
  • python实战练习1:矩阵和整数相乘
       1#方法一:这是最先想到的2s=[[1,2,3],[4,5,6],[7,8,9]]3n=int(input())45r=[]6foriins:7a=[]#这个很重要,每次要清空8forjini:9a.append(j*n)10r.append(a)1112print(r)13141516171......
  • dp-矩阵链相乘顺序
    矩阵链相乘顺序目录矩阵链相乘顺序问题描述举例说明问题分析程序问题描述A1,A2,..,An表示n个矩阵的序列,其中Ai为\(P_{i−1}×P_i\)阶矩阵,i=1,2,...,n。向量P=<P0,P1,P2..Pi>表示矩阵链的输入,其中P0是A1的行数,P1是A1的列数,P1是A2的行数,以此类推。计算这个矩阵需要做n−1次两......
  • 复习:矩阵快速幂
    前言emmm太久了忘了许多写笔记来复习一下概念矩阵乘法什么是矩阵乘法?给你两个矩阵\(a,b\)则令\(c=a*b\)有\(c_n=a_n\),\(c_m=b_m\)\[\sum\limits_{i=1}^{c_n}\sum\limits_{j=1}^{c_m}c_{i,j}\sum\limits_{k=1}^{a_m}a_{i,k}*b_{k,j}\]两个矩阵做乘法的前提:\(a_m=b_n\)......
  • 1572. 矩阵对角线元素的和
    1572.矩阵对角线元素的和2023年8月12日19:07:511572.矩阵对角线元素的和简单给你一个正方形矩阵mat,请你返回矩阵对角线元素的和。请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。示例1:输入:mat=[[1,2,3],[4,5,6],[......
  • 1572. 矩阵对角线元素的和
    题目链接给定一个正方形矩阵,返回对角线元素的和(两条对角线,中心的元素不要叠加两次)。第一种方法:遍历矩阵矩阵中某个位置(i,j)如果处于对角线上。则一定满足下列条件之一:i=j;i+j=n-1;根据上边的结论,可以遍历整个矩阵。如果满足条件之一,则表示该元素在对角线上,加入到......