poj 1050 To the Max(最大子矩阵之和)

来源:互联网 发布:淘宝删差评 编辑:程序博客网 时间:2024/05/29 02:31

http://poj.org/problem?id=1050

       我们已经知道求最大子段和的dp算法 参考 here  也可参考编程之美有关最大子矩阵和部分。

      然后将这个扩大到二维就是这道题。顺便说一下,有时候不要把问题想复杂了,有些问题只能靠暴力求解,而这道题是暴力加算法。

      在这个题中,我们可以把二维压缩到一维然后求解最大子段。我们先枚举所求矩阵的起点行和结束行,然后把每一列的数据之和求出,用这些数据和就构造出一个一维的数组(代码中我没有明确表示出这个数组),然后用最大子段和的dp算法求解。

     关于二维压缩到一维的过程,适当处理可以大大减小时间复杂度。

     最终时间复杂度是O(n^3);

我的代码,思路是正确的,但是提交上去之后wa了,求大神赐教。

//2013-06-26-08.45//poj 1050#include <iostream>#include <string.h>#include <algorithm>int map[103][103];int sum[103][103];using namespace std;int main(){    int n;    while (cin >> n)    {        memset(sum, 0, sizeof(sum));        for (int i = 1; i <= n; i++)        {            for (int j = 1; j <= n; j++)            {                 cin >> map[i][j];                 sum[i][j] = map[i][j] + sum[i-1][j];            }        }        int ans = 0;        for (int i = 1; i <= n; i++)        {            for (int j = 0; j < i; j++)            {                int tol = 0;                for (int k = 1; k <= n; k++)                {                    if (sum[i][k]-sum[j][k] < 0)  //这个地方就是压缩后的数组                        tol = 0;                    else                        tol += (sum[i][k]-sum[j][k]);                    if (tol > ans)                        ans = tol;                }            }        }        cout << ans << endl;    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 飞线鞋面破了怎么办 新袜子穿了很滑怎么办 鞋底硬脚底板疼怎么办 新鞋前面太硬怎么办 新鞋子鞋底太硬怎么办 不到一米八的身高想扣篮怎么办 鞋胶粘在鞋面上怎么办 鞋子上沾了胶怎么办 休闲鞋号码大了半码怎么办 高跟鞋大了一码怎么办 浅口单鞋买大了怎么办 新鞋子磨大脚趾怎么办 鞋前面磨大脚趾怎么办 白鞋子蹭黑了怎么办 夏天穿皮鞋捂脚怎么办 耐克赤足掉漆怎么办 鞋子买回来小了怎么办 布鞋大了一码怎么办 鞋子买小了一码怎么办 运动鞋小了一码怎么办 帆布鞋小了一码怎么办 脚踝骨韧带断了怎么办 咖啡喝多了失眠怎么办 奥迪q7电瓶没电怎么办 一岁宝宝坐不稳怎么办 2岁宝宝不肯把尿怎么办 踢足球上肢和下肢不协调怎么办 ppt文字放映时重叠怎么办 月子8天腰背疼怎么办 生完五天腰背疼怎么办 生完孩子腰不好怎么办 养了个白眼狼怎么办 孩子学东西很慢怎么办 手不小心碰肿了怎么办 腿中间摩擦的疼怎么办 晚上睡觉时双腿酸胀怎么办 腿擦破皮了怎么办 快速好 宝宝腿擦破皮了怎么办 新生儿睡觉腿喜欢弯曲怎么办 孩子八个月交叉走路怎么办 胫椎引起双腿发热怎么办