HihoCoder 1634 Puzzle Game

题目:https://cn.vjudge.net/problem/HihoCoder-1634

题意:给你一个矩阵,可以修改其中一个值为p,让你求最大子矩阵的最小值

我们可以暴力枚举每个点是否修改

当这个点不在最大矩阵内时,一定是它的上下左右的最大子矩阵大

当这个点在最大矩阵内时,可以直接判断

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
const int N=150+5;
const int inf=0x80808080;
int L[N],R[N],U[N],D[N];
int a[N][N],dp[N][N],ma[N][N];
int n,m,p;
void init()
{
    memset(L,0x80,sizeof(L));
    memset(R,0x80,sizeof(R));
    memset(U,0x80,sizeof(U));
    memset(D,0x80,sizeof(D));
}
void solve()
{
    int t;
    //down
    memset(dp,0,sizeof(dp));
    memset(ma,0x80,sizeof(ma));
    t=inf;
    for(int i=1;i<=n;i++)
    {
        for(int l=1;l<=m;l++)
        {
            int sum=0;
            for(int r=l;r<=m;r++)
            {
                sum+=a[i][r];
                dp[l][r]+=sum;
                ma[l][r]=max(ma[l][r],dp[l][r]);
                if (dp[l][r]<0) dp[l][r]=0;
                t=max(t,ma[l][r]);
            }
        }
        D[i]=t;
    }
    //up
    memset(dp,0,sizeof(dp));
    memset(ma,0x80,sizeof(ma));
    t=inf;
    for(int i=n;i>=1;i--)
    {
        for(int l=1;l<=m;l++)
        {
            int sum=0;
            for(int r=l;r<=m;r++)
            {
                sum+=a[i][r];
                dp[l][r]+=sum;
                ma[l][r]=max(ma[l][r],dp[l][r]);
                if (dp[l][r]<0) dp[l][r]=0;
                t=max(t,ma[l][r]);
            }
        }
        U[i]=t;
    }
    //right
    memset(dp,0,sizeof(dp));
    memset(ma,0x80,sizeof(ma));
    t=inf;
    for(int i=1;i<=m;i++)
    {
        for(int l=1;l<=n;l++)
        {
            int sum=0;
            for(int r=l;r<=n;r++)
            {
                sum+=a[r][i];
                dp[l][r]+=sum;
                ma[l][r]=max(ma[l][r],dp[l][r]);
                if (dp[l][r]<0) dp[l][r]=0;
                t=max(t,ma[l][r]);
            }
        }
        R[i]=t;
    }
    //left
    memset(dp,0,sizeof(dp));
    memset(ma,0x80,sizeof(ma));
    t=inf;
    for(int i=m;i>=1;i--)
    {
        for(int l=1;l<=n;l++)
        {
            int sum=0;
            for(int r=l;r<=n;r++)
            {
                sum+=a[r][i];
                dp[l][r]+=sum;
                ma[l][r]=max(ma[l][r],dp[l][r]);
                if (dp[l][r]<0) dp[l][r]=0;
                t=max(t,ma[l][r]);
            }
        }
        L[i]=t;
    }
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&p)!=EOF)
    {
        init();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        solve();
        int ans=D[n];
        /*
            为什么可以枚举所有点
            因为如果这个点不在最大矩阵内,
            当D[n]-a[i][j]+p变大时,不影响ans
            当D[n]-a[i][j]+p变小时,不影响t
        */
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
        {
            int t=max(max(D[i-1],U[i+1]),max(L[j+1],R[j-1]));
            t=max(t,D[n]-a[i][j]+p);
            ans=min(ans,t);
        }
        printf("%d\n",ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/bk-201/p/8728185.html

时间: 2024-09-29 16:43:24

HihoCoder 1634 Puzzle Game的相关文章

Hihocoder 1634 Puzzle Game(2017 ACM-ICPC 北京区域赛 H题,枚举 + 最大子矩阵变形)

题目链接  2017 Beijing Problem H 题意  给定一个$n * m$的矩阵,现在可以把矩阵中的任意一个数换成$p$,求替换之后最大子矩阵的最小值. 首先想一想暴力的方法,枚举矩阵中的数,然后$O(n^{3})$求最大子矩阵更新答案,这样复杂度是$O(n^{5})$的. 思考得再仔细一些,就是包含这个数的最大子矩阵和,以及不包含这个数的最大子矩阵的和的较大值. 设原矩阵中最大子矩阵和为$mx$. 设$u_{i}$为只考虑矩阵前$i$行的最大子矩阵和,$d_{i}$为考虑矩阵第$

HihoCoder 1634 Puzzle Game(最大子矩阵和)题解

题意:给一个n*m的矩阵,你只能选择一个格子把这个格子的数换成p(也可以一个都不换),问最大子矩阵和最小可能是多少? 思路: 思路就是上面这个思路,这里简单讲一下怎么n^3求最大子矩阵和:枚举两行(或者两列),然后把每一列之和看做一个数字,这样二维就变成了一维,我们可以直接求最大子串和的方法.初始一个ret为0,然后从左往右加,如果ret<0,那么把ret初始化0,负数作为初始值肯定比重新开始小,然后找出ret的最大值就是最大子矩阵和. 代码: #include<cstdio> #inc

hihoCoder 1426 : What a Ridiculous Election(总统夶选)

hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 In country Light Tower, a presidential election is going on. There are two candidates,  Mr. X1 and Mr. X2, and both of them are not like good per

[hihoCoder#1381]Little Y&#39;s Tree

[hihoCoder#1381]Little Y's Tree 试题描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块.小J想知道每个连通块中最远点对距离的和. 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作. 输入 第一行一个整数n,接下来n-1行每行三个整数u,v,w,其中第i行表示第i条边边权为wi,连接了ui,vi两点. 接下来一行一个整数q,表示有q组询问. 对于每组询问,第一行一个正整数k,接下来一

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

Hihocoder 太阁最新面经算法竞赛18

Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus 描述 Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix. size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1

hihoCoder 1393 网络流三&#183;二分图多重匹配(Dinic求二分图最大多重匹配)

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加