zoukankan      html  css  js  c++  java
  • hihocoder1634 Puzzle Game

    题目链接:(vjudge) 戳我

    和上面那个matrix 比较像。
    大概题意就是给你一个n*m的矩阵,然后可以选择其中一个数字进行修改(当然也可以不修改),使得矩阵的最大子矩阵尽可能小。最后输出这个值。

    我们(n^2)遍历i,j,对于一个位置([i,j])看看如果对它进行更改结果会如何。显然如果p值大于该节点的数,我们可以选择不更改。

    我们考虑修改了位置为i,j的一个数后,剩下的最大子矩阵会有什么情况?

    这里进行分类讨论,第一类是不选择这个数字了。之后最大子矩阵就有“在它左边”,“在它右边”,“在它上面”,“在它下面”四种情况了。而这四种情况对应的最大子矩阵和显然我们可以通过预处理计算出来。

    第二类是仍然选择这个数字,这个比较简单,直接对原来矩阵的最大子矩阵和进行更改即可。

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #define MAXN 310
    using namespace std;
    int n,m,p,ans,ansans,all;
    int a[MAXN][MAXN],up[MAXN],down[MAXN],ll[MAXN],rr[MAXN],sum[MAXN],dp[MAXN];
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        while(scanf("%d%d%d",&n,&m,&p)!=EOF)
        {
            memset(a,0,sizeof(a));
            for(int i=0;i<=300;i++)
                ll[i]=rr[i]=up[i]=down[i]=-0x3f3f3f3f;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&a[i][j]);
            memset(dp,0,sizeof(dp));
            for(int l=1;l<=n;l++)
            {
                memset(sum,0,sizeof(sum));
                for(int r=l;r<=n;r++)
                {
                    int cur_ans=-0x3f3f3f3f;
                    for(int i=1;i<=m;i++)
                    {
                        if(l==r) sum[i]=a[r][i];
                            else sum[i]+=a[r][i]; 
                        dp[i]=max(dp[i-1]+sum[i],sum[i]);
                        cur_ans=max(dp[i],cur_ans);
                    }
                    for(int i=r;i<=n;i++) up[i]=max(up[i],cur_ans);
                    for(int i=1;i<=l;i++) down[i]=max(down[i],cur_ans); 
                }
            }
            memset(dp,0,sizeof(dp));
            for(int l=1;l<=m;l++)
            {
                memset(sum,0,sizeof(sum));
                for(int r=l;r<=m;r++)
                {
                    int cur_ans=-0x3f3f3f3f;
                    for(int i=1;i<=n;i++)
                    {
                        if(l==r) sum[i]=a[i][r];
                            else sum[i]+=a[i][r];
                        dp[i]=max(dp[i-1]+sum[i],sum[i]);
                        cur_ans=max(cur_ans,dp[i]);
                    }
                    for(int i=r;i<=m;i++) ll[i]=max(ll[i],cur_ans);
                    for(int i=1;i<=l;i++) rr[i]=max(rr[i],cur_ans);
                }
            }
            //for(int i=1;i<=n;i++)printf("i=%d ll=%d rr=%d up=%d down=%d
    ",i,ll[i],rr[i],up[i],down[i]);
            ansans=up[n];
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(a[i][j]<p) continue;
                    ans=-0x3f3f3f3f;
                    ans=max(ans,max(max(up[i-1],down[i+1]),max(ll[j-1],rr[j+1])));
                    ans=max(ans,down[1]-a[i][j]+p);
                    ansans=min(ansans,ans);
                }
            }
            printf("%d
    ",ansans);
        }
    }
    
  • 相关阅读:
    java执行shell命令,chmod 777 xxx,改变权限无效的解决办法。
    SpringBoot配置双数据源(一个项目同时连接操作两台数据库)
    《机器学习》周志华西瓜书习题参考答案:第2章
    《机器学习》周志华西瓜书学习笔记(二):模型评估与选择
    只用一套解决方案,就可解决80%的交通物流行业信息难题
    原码、反码、补码
    400+节点的Elasticsearch集群运维
    史上最全PostgreSQL体系结构
    IDEA创建JAVAFX并打包成exe
    DB2 Zos 浅谈
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10347388.html
Copyright © 2011-2022 走看看