标签:dfs+剪枝。

题解:

  这道题看着就像一道dfs题目,没有什么算法可以用来算这个东西,于是想想暴搜。
  如果我们确定因为是2*2的子矩阵的和,如果确定了其中三个,那么就可以确定第四个,发现如果确定了第一行和第一列的话,就可以确定整个矩阵了,于是我们枚举只有399个了。
  因为要求字典序最小,我们先默认第一行和第一列全部是0,求出一个矩阵。我们先搜索第一行,从左到右。发现在(1,1)位置的数+k,那么在除了第一行和第一列的矩阵中,要合法,就要i+j为偶数的-=k,i+j为奇数的+=k即可。同样在(1,j)位置+=k,那么只影响这一列,便偶数行号-=k,奇数行号+=k即可。我们在保证了第一行最小的情况下,只要保证第一列最小即可满足字典序最小,因为确定第一行和第一列可以唯一的确定一个矩阵。
  第一行我们暴搜,当然需要剪枝了,对于每搜到第一行的一个数,就要扫一遍这一列,并且更新这一列的每个元素的所在行的行首的范围,也就是矩阵第一列每一个元素的范围,因为矩阵中的每一个元素只被三个数影响,那就是(1,1),以及行首与列首。更新了第一列每一个元素的范围之后,如果冲突即(L>R)那么就返回0。
  这里有一个技巧:按道理范围只要开一个O(n)的数组即可,但是这样需要备份,因为如过搜索失败了,那么回溯也要恢复范围数组的值,很麻烦,那么我们直接开一个二维数组,每次更新时取上一列的值与当前值比较之后再更新,这样就没有回溯的问题了,因为我们是从左到右枚举第一行的。

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=,INF=0x3f3f3f3f;
int n,m,P;
int L[MAXN][MAXN],R[MAXN][MAXN],A[MAXN][MAXN];
inline int gi(){int res; scanf("%d",&res); return res;}
int F(int x){return (x&)?:-;}
int cal(int x,int y) { return A[x][y]+F(x+y)*A[][]+F(y)*L[x][m]+F(x)*A[][y]; }
bool dfs(int y)
{
if(y>m)return ;
int bacl[MAXN]={},bacr[MAXN]={};
for(A[][y]=;A[][y]<P;A[][y]++)
{
bool flag=;
for(int i=;i<=n;i++)
{
int tl=(A[i][y] + A[][]*F(i+y) + A[][y]*F(i)) * F(y+);
int tr=(A[i][y] + A[][]*F(i+y) + A[][y]*F(i)-(P-)) * F(y+);
if(tl>tr)swap(tl,tr);
L[i][y]=max(L[i][y-],tl);
R[i][y]=min(R[i][y-],tr);
if(L[i][y]>R[i][y])
{flag=; break;}
}
if(flag)
if(dfs(y+))
return ;
}
return ;
}
int main()
{
n=gi(); m=gi(); P=gi();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
A[i][j]=gi();
if(i!= && j!=)
A[i][j]-=(A[i][j-]+A[i-][j]+A[i-][j-]);
R[i][j]=P-;
}
}
for(;A[][]<P;A[][]++)
{
if(dfs())
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(j== && i>)
printf("%d ",L[i][m]);
else if(i== && j>)
printf("%d%c",A[][j],j==m?'\n':' ');
else
printf("%d%c",cal(i,j),j==m?'\n':' ');
}
return ;
}
}
return ;
}

[HNOI2010] 矩阵 matrix的更多相关文章

  1. numpy教程:矩阵matrix及其运算

    http://blog.csdn.net/pipisorry/article/details/48791403 numpy矩阵简介 NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组ar ...

  2. 【BZOJ2003】[HNOI2010]矩阵(搜索)

    [BZOJ2003][HNOI2010]矩阵(搜索) 题面 懒得粘了,不难找吧. 题解 看的学长写的题解,也懒得写了 大概是这样的. 不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确 ...

  3. 果皇的矩阵[matrix]

    #1101. 果皇的矩阵[matrix] 题目描述 输入格式 一行两个数,表示 N,M. 输出格式 一行一个数,表示答案对 10^9+7 取模后的结果 样例 样例输入 3 3 样例输出 38 数据范围 ...

  4. python小白之矩阵matrix笔记(updating)

    Matrix #python学习之矩阵matrix 2018.4.18 # -*- coding: UTF-8 -*- from numpy import * import numpy as np i ...

  5. 题解 矩阵 matrix

    矩阵 matrix Description 给出一个 n × m 的矩阵.请在其中选择至多 3 个互不相交的,大小恰为 k × k 的子矩阵,使得子矩阵的 权值和最大. Input 第一行三个整数 n ...

  6. 矩阵matrix

    矩阵matrix 1. 矩阵matrix 1.1. 定义由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 这m×n 个数称为矩阵A的元素,简称为元,数aij ...

  7. bzoj2003 [Hnoi2010]矩阵

    Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...

  8. 变形--矩阵 matrix()

    matrix() 是一个含六个值的(a,b,c,d,e,f)变换矩阵,用来指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵.就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素 ...

  9. 矩阵 matrix

    传送门 注意这题时限是2s [问题描述] 有一个n × m的矩阵,你从左上角走到右下角,只能向下和向右走. 每个点上有一个重量v i,j 价值w i,j 的物品,你有一个容量为S的背包,经过一个点你可 ...

随机推荐

  1. Java之运行时异常与编译时异常区别

    Java中用2种方法处理异常: 1.在发生异常的地方直接处理: 2.将异常抛给调用者,让调用者处理. Java异常可分为3种: (1)编译时异常:Java.lang.Exception (2)运行期异 ...

  2. Hadoop实战-MapReduce之WordCount(五)

    环境介绍: 主服务器ip:192.168.80.128(master)  NameNode  SecondaryNameNode ResourceManager 从服务器ip:192.168.80.1 ...

  3. 阿里 JAVA 开发手册 学习 4 工程规约

    应用分层 1.分层如下 1)开放接口层:可以直接封装Service接口暴露成RPC:通过web封装成http接口:网关控制层等. 2)终端显示层:各个端的模板渲染并执行显示层. 3)Web层:主要是度 ...

  4. 【Effective C++】实现

    条款26:尽可能延后变量定义式的出现时间 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造成了开始定义的对象并没有被使用,而付出了构造成本来析构成本. 所以我们应该在定义对象时,尽可能 ...

  5. AndroidPageObjectTest_TimeOutManagement.java

    以下代码使用ApiDemos-debug.apk进行测试 //这个脚本用于演示PageFactory的功能:设置timeout时间. package com.saucelabs.appium; imp ...

  6. protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object

    使用protobuf出错:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object ...

  7. codeforces Codeforces Round #273 (Div. 2) 478B

    B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. Linux 查看服务状态(服务与进程)

    原文地址:http://blog.csdn.net/weixin_37979944/article/details/79029188 指令(instruction): 计算机实际上可以做的事情实质上非 ...

  9. uva 10881 Piotr's Ants 解题报告

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pa ...

  10. 继续servlet理论篇

    唉,毕业是件很麻烦的事情,实习也是一件很郁闷的事情,现在公司很注重基础,所以 所以还要看java,不过,我年轻,我有激情.来吧,来着不惧,说这话,有些心虚. HttpServlet类中所提供的doGe ...