您的位置:首页 > 其它

acm-poj1050解题报告

2015-05-19 22:13 148 查看
题目地址:http://poj.org/problem?id=1050

题目大意:简单易懂,求一个最大为100*100矩阵中的子矩阵中元素之和的最大值

解题思路:说实话这道题算是DP,本人现在正在补,对DP还是不太熟悉,甚至还在网上参考了一些算法过程以及思路才写出的代码,最后终于AC了(笑)

                   首先,解这道题要有求最大子段和的基础,如给你一个数组a,求数组中a[i]+a[i+1]+...+a[j]的最大值

                   解法很简单,参考如下:

                   int b=0,sum=-100000000;  

                       for(int i=0;i<n;i++)  

                       {  

                           if(b>0) b=b+a[i];  

                           else     b=a[i];  

                           if(b>sum) sum=b;    

                       }  

                     再说本道题,主要思想为将其转化为一维数组求最大子段和,如果最优解左起第i列,右止于第j列,那么我们相当于把这些列的对应位加和,成为一列,

                     并对改列求最大子段和即可(降维思想)。

代码:

#include<cstdio>

#include<string.h>

#include<string>

#include<iostream>

using namespace std;

#define maxn 105

#define inf 0x3f3f3f3f

int array[maxn][maxn];

int f[maxn][maxn][maxn];

int main()

{

    int n;cin>>n;

    for(int i=1;i<=n;i++)

    {

        for(int j=1;j<=n;j++){scanf("%d", &array[i][j]);}

    }

    memset(f, 0, sizeof(f));

    int ans=-inf;

    for(int i=1;i<=n;i++)

    {

        for(int j=1;j<=n;j++)

        {

            int sum=0;

            for(int k=j;k<=n;k++)

            {

                sum+=array[i][k];

                f[i][j][k]=max(f[i-1][j][k]+sum,sum);//i是指行,j是起始列,k是终结列,f存的值为在ijk范围内的元素和最大值

                ans=max(ans,f[i][j][k]);

            }

        }

    }

    cout<<ans<<endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 算法 poj