您的位置:首页 > 其它

poj 1050 To the Max

2012-06-08 16:10 295 查看
题目链接:http://poj.org/problem?id=1050

//zhaomingming	1050	Accepted	580K	63MS	C++	1356B

/**思路:用 i,j表示起始行和终止行,遍历所有可能
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
当 i = 2; j = 4时,即在2,3,4行求解。
我们考察其中一种情况 i=2 j=4,这样就相当与选中了2 3 4三行,求那几列的组合能获得最大值,由于总是 2 3 4行,所以我们可以将这3行”捆绑”起来,变为求 4(9-4-1),11(8+2+1),-10(-6-4+0),7(7+2-2)
的最大子段和,问题成功转化为一维的情况!
**/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int M = 1010;
int a[M][M];
int n;
int ans[M];
int maxx;
int solve()
{
    memset(dp,0,sizeof(dp));
    maxx = -999;  
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(i == j)   //单独处理,只有一行的情况
            {
                for(int k = 1; k <= n; k++)
                    ans[k] = a[i][k];
            }
            else
            {
                for(int k = 1; k <= n; k++)
                {
                    ans[k] = 0;
                    for(int h = i; h <= j; h++) //捆绑
                    {
                        ans[k] += a[h][k];
                    }
                }
            }
            //这里就是一维的,求最大连续子段和
            int sum = 0,max1 = 0;
            for(int k = 1; k <= n; k++)
            {
                sum += ans[k];
                if(sum > max1)
                max1 = sum;
                else if(sum < 0)
                sum = 0;

            }
            if(maxx < max1)
                maxx = max1;
        }
    }
    return 0;
}

int main()
{

    cin >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> a[i][j];

    solve();

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