• Puzzle Game HihoCoder


    题目链接:https://cn.vjudge.net/problem/HihoCoder-1634
    题目意思:可以让矩阵里的某一个数变成p,或者不修改。求最大子矩阵最小,输出最小值。
    思路:请看下图

    代码:

    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <stdlib.h>
    #include <math.h>
    
    using namespace std;
    typedef long long int LL;
    int max(int a,int b,int c,int d)
    {
        return max(max(a,b),max(c,d));
    }
    const int maxn=155;
    const int INF=2e9+1e8;
    int n,m,p;
    int a[maxn][maxn],dp[maxn][maxn],ma[maxn][maxn],L[maxn],R[maxn],U[maxn],D[maxn];
    void init()
    {
        memset(L, 0x88, sizeof(L));
        memset(R, 0x88, sizeof(R));
        memset(U, 0x88, sizeof(U));
        memset(D, 0x88, sizeof(D));
    }
    void deal()
    {
        int tmp;
        //  xia
        memset(dp, 0, sizeof(dp));
        memset(ma, 0x88, sizeof(ma));
        tmp = -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;
                    tmp = max(tmp, ma[l][r]);
                }
            }
            D[i] = tmp;
        }
        // zuo
        memset(dp, 0, sizeof(dp));
        memset(ma, 0x88, sizeof(ma));
        tmp = -INF;
        for (int i = m; i>0; 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;
                    tmp = max(tmp, ma[l][r]);
                }
            }
            L[i] = tmp;
        }
        // shang
        memset(dp, 0, sizeof(dp));
        memset(ma, 0x88, sizeof(ma));
        tmp = -INF;
        for (int i = n; i>0; 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;
                    tmp = max(tmp, ma[l][r]);
                }
            }
            U[i] = tmp;
        }
        // you
        memset(dp, 0, sizeof(dp));
        memset(ma, 0x88, sizeof(ma));
        tmp = -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;
                    tmp = max(tmp, ma[l][r]);
                }
            }
            R[i] = tmp;
        }
    }
    
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&p)+1)
        {
            init();
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                    scanf("%d",&a[i][j]);
            }
            deal();
            int ans=D[n];
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    int tmp=max(D[i-1],U[i+1],L[j+1],R[j-1]);
                    tmp=max(tmp,D[n]-a[i][j]+p);
                    ans=min(ans,tmp);
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
    
    /*
    3 3 -10
    -100 4 4
    4 -10 4
    4 4 1
    3 3 -1
    -2 -2 -2
    -2 -2 -2
    -2 -2 -2
    
    
    */
    
  • 相关阅读:
    转载---JVM四种引用--用于记录知识
    Ionic的安装、创建、及一些记录
    Angular响应式表单--附上完整代码演示
    Angular自定义模块—使用路由实现懒加载--及错误解决
    Angular自定义模块(普通)
    Angula获取服务器数据
    Angular同步与异步获取服务数据(附完整代码)
    Angular父子组件的方法传递以及数据传递
    logrotate
    Capistrano 3
  • 原文地址:https://www.cnblogs.com/coded-ream/p/dp.html
Copyright © 2020-2023  润新知