URAL_1146/uva_108 最大子矩阵 DP 降维

题意很简单,给定一个N*N的大矩阵,求其中数值和最大的子矩阵。

一开始找不到怎么DP,没有最优子结构啊,后来聪哥给了我思路,化成一维,变成最大连续和即可。为了转化成一维,必须枚举子矩阵的宽度,通过预处理的suffix可以很快计算出每一列某一段的和,然后进行一维DP即可。。总复杂度为 O(N^3);

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mat[110][110];
int suffix[110][110];
int n;
int main()
{
    while (scanf("%d",&n)!=EOF)
    {
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<=n; j++)
            {
                scanf("%d",&mat[i][j]);
            }
        }
        //memset(suffix,0,sizeof suffix);
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<=n; j++)
            {
                suffix[i][j]=suffix[i][j-1]+mat[i][j];
            }
        }
        int d=0;
        int ans=0;
        for (int i=1; i<=n; i++)
        {
            for (int j=i; j<=n; j++)
            {
                d=0;
                for (int k=1; k<=n; k++)
                {
                    int tmp=suffix[k][j]-suffix[k][i-1];
                    if (d+tmp>tmp) d+=tmp;
                    else d=tmp;
                    ans=max(d,ans);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

  

URAL_1146/uva_108 最大子矩阵 DP 降维,布布扣,bubuko.com

时间: 2024-10-18 04:44:47

URAL_1146/uva_108 最大子矩阵 DP 降维的相关文章

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

ZOJ1074 (最大和子矩阵 DP)

F - 最大子矩阵和 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the

BZOJ 1084: [SCOI2005]最大子矩阵( dp )

最多只有2列..分开来dp 1列 dp(x, k) = max( dp(x - 1, k), dp(p, k - 1) + sum(p+1~x) ) 2列 dp(a, b, k) = max( dp(a - 1, b, k), dp(a, b - 1, k), dp(p, b, k - 1) + sum1(p+1~a), dp(a, p, k - 1) + sum2(p+1~b) ) 当a = b, dp(a, b, k)还可以用dp(p, p, k - 1) + SUM(p+1~a) (0 ≤

HDU 1559 最大子矩阵 (DP)

题目地址:HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每个矩阵的左上方的点,由于矩阵的长和宽是固定的,那么这个矩阵实际上也已经固定了.此时这个矩阵的和用公式: sum=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1]; 取最大值就可以了. 代码如下: #include <iostream> #include <cstdio> #in

[Tyvj Aug11] 黄金矿工

传送门 Description 黄金矿工是一个经典的小游戏,它可以锻炼人的反应能力.该游戏中,可以通过"挖矿"获得积分并不断升级.玩家可以在线玩flash版黄金矿工,也可以下载后玩单机版黄金矿工.目前,黄金矿工小游戏有多个版本,例如黄金矿工双人版,黄金矿工单人版等. Jimmy是一位黄金矿工,他所在的金矿是一个n*n的矩形区域(俯视),区域内有黄金.石头和TNT,由一个 n*n的矩阵描述.黄金的价值对应矩阵中的正值,石头的价值对应矩阵中的负值,TNT由0表示.换句话说,挖到黄金赚钱,石

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

[TJOI2018]碱基序列

嘟嘟嘟 现在看到字符串就想到SAM,所以很担心kmp啥的会不会忘了-- 这题感觉挺暴力的:首先当然要把\(s\)建成SAM,然后令\(dp[i][j]\)表示到第\(i\)组时,SAM上节点\(j\)能匹配的字符串个数. 转移的时候暴力枚举起点节点\(p\),然后每一次都把当前字符串放上去跑,如果在SAM上存在的话,令结束节点为\(x\),则有\(dp[i][x] += dp[i - 1][p]\). 那么最后的答案就是\(\sum _ {i = 1} ^ {cnt} dp[m][i] * si

openjudge1768 最大子矩阵[二维前缀和or递推|DP]

总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15. 输入 输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给

NOIP2014pj子矩阵[搜索|DP]

题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素得到一个2*3的子矩阵如右图所示. 9 3 3 3 9 9 4 8 7 4 1 7 4 6 6 6 8 5 6 9 7 4 5 6 1 的其中一个2*3的子矩阵是 4 7 4 8 6 9 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的. 矩阵的分值:矩阵中每一对相邻元素之差