UVa108

MaximumSum

题意:求最大子矩阵和

状态转移方程

dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + a[i][j]

#include <stdio.h>
#include <string.h>

int a[110][110], dp[110][110];

int main(int argc, char *argv[])
{
    int n, i, j, k, g, max;
    while(scanf("%d", &n) != EOF)
    {
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                scanf("%d", &a[i][j]);

        max = -10000000;
        memset(dp, 0, sizeof(dp));
        for(g = 1; g <= n; g++)
            for(k = 1; k <= n; k++)
            {
                for(i = g; i <= n; i++)
                    for(j = k; j <= n; j++)
                    {
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + a[i][j];
                        if(dp[i][j] > max)
                            max = dp[i][j];
                    }
                memset(dp, 0, sizeof(dp));
            }

        printf("%d\n", max);

    }
    return 0;
}

UVa108,布布扣,bubuko.com

时间: 2024-11-04 10:54:49

UVa108的相关文章

UVA108 - Maximum Sum(最大连续和)

题意:从一个n*n的矩阵中找出和最大的子矩阵 思路:最大连续和的求解.我们可以将二维的转化为一维进行计算.sum[i][j]表示以(1, 1)和(i, j)为对角的矩阵的和.之后只要逐个枚举每个可能出现的值,保存最大值即可. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3

uva108 Maximum sum(矩阵最大和)

题目;uva108 Maximum sum(矩阵最大和) 题目大意:给出一个n*n的矩阵,求这个矩阵的最大和.这个矩阵不是连通的,只能在这个矩阵内找子矩阵,不能越过边界. 解题思路:枚举起点和终点,每个起点和终点就是一个矩阵,每个矩阵都算矩阵和,然后保留最大值.每个矩阵的值只要横着相加一遍,再竖着相加一遍,就可以得出以这个矩阵为起点的所有的子矩阵的和(这里可以直接要这个矩阵的和,因为里面的子矩阵枚举起和终点的时候都会算到),然后记录最大值. 例如 : 2 2 3 3 3  4 横着相加  2 4

uva10827-Maximum sum on a torus(矩阵最大和的变形)

题目;uva10827-Maximum sum on a torus(矩阵最大和的变形) 题目大意:就是uva108的变形,矩阵能够连通,就是可以从后面连到前面.这里把矩阵复制三遍,然后重新生成一个大的矩阵,就可以解决联通的问题.再枚举矩阵的起点和终点所有情况,保留最大值就可以了. 例如:1 2 3 2 3 4 新的矩阵: 1 2 3  1 2 3 2 3 4  2 3 4 1 2 3   1 2 3 2 3 4   2 3 4 代码: #include <stdio.h> #include