Square Submatrix

题意:

给你个N*N矩阵,(N《=400),找出其子矩阵中左对角线和(左上角到右下角),减右对角线和(左下角到右上角)最大差值。

算法:

普素算法是 O( N * N * N * N )

超时,关键是优化求对角线和算法。

以空间换时间。用两个二维数组保存好对角线和。

O(  N * N * N ) ac

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

int mp1[410][410];
int mp2[410][410];
int mt[410][410];

int main( )
{
   int N, M;
   scanf("%d",&N);
   while( N-- )
   {  
      scanf("%d",&M);
      for( int i = 1; i <= M; i++)
      {
         for( int j = 1; j <= M; j++)
         {
            scanf("%d",&mt[i][j]);           
         }
           
      }
      memset(mp1,0,sizeof(mp1));
      memset(mp2,0,sizeof(mp2));
      for( int i = 1; i <= M; i++)
      {
          for( int j = 1; j <= M; j++)
          {
              mp1[i][j] = mt[i][j] + mp1[i-1][j-1];
            //  printf("%d ",mp1[i][j]);
          }
          puts("");    
           
      }
      for( int i = 1; i <= M; i++)
      {
         for( int j = M; j >= 1; j--)
         {
              mp2[i][j] = mt[i][j] + mp2[i-1][j+1];
            //  printf("%d ",mp2[i][j]);     
              
         }
         puts("");
      }
      int maxn = -0x7f7f7f7f;
      for( int i = 1; i <= M; i++)
      {
         for( int j = 1; j <= M; j++)
         {
             for( int k = 1; k + i <= M && k + j <= M; k++)
             {
                 int x = mp1[i+k][j+k] - mp1[i][j] + mt[i][j];
                 int y = mp2[i+k][j] - mp2[i][j+k] + mt[i][j+k];
                 maxn =  max(maxn, x - y );         
                  
             }           
         }
           
      }
      printf("%d\n",maxn);         
          
   }    
   return 0; 
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/07/30/2615519.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用C语言解决下列问题:Kirill wants to weave the very beautiful blanket consisting of n×m of the same size square patches of some colors. He matched some non-negative integer to each color. Thus, in our problem, the blanket can be considered a B matrix of size n×m consisting of non-negative integers. Kirill considers that the blanket is very beautiful, if for each submatrix A of size 4×4 of the matrix B is true: A11⊕A12⊕A21⊕A22=A33⊕A34⊕A43⊕A44, A13⊕A14⊕A23⊕A24=A31⊕A32⊕A41⊕A42, where ⊕ means bitwise exclusive OR Kirill asks you to help her weave a very beautiful blanket, and as colorful as possible! He gives you two integers n and m . Your task is to generate a matrix B of size n×m , which corresponds to a very beautiful blanket and in which the number of different numbers maximized. Input The first line of input data contains one integer number t (1≤t≤1000 ) — the number of test cases. The single line of each test case contains two integers n and m (4≤n,m≤200) — the size of matrix B . It is guaranteed that the sum of n⋅m does not exceed 2⋅105 . Output For each test case, in first line output one integer cnt (1≤cnt≤n⋅m) — the maximum number of different numbers in the matrix. Then output the matrix B (0≤Bij<263) of size n×m . If there are several correct matrices, it is allowed to output any one. It can be shown that if there exists a matrix with an optimal number of distinct numbers, then there exists among suitable matrices such a B that (0≤Bij<263) .
最新发布
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值