hdu 1081 (dp_区间dp)

来源:互联网 发布:淘宝网的网址域名 编辑:程序博客网 时间:2024/05/17 03:06

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 whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle. 
As an example, the maximal sub-rectangle of the array: 

0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
is in the lower left corner: 

9 2 
-4 1 
-1 8 
and has a sum of 15. 

Input

The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].

Output

Output the sum of the maximal sub-rectangle.

Sample Input

40 -2 -7 0 9 2 -6 2-4 1 -4  1 -18  0 -2

Sample Output

15

这是一个动态规划问题,onedim[ ]表示将i 到 j 行的数字压缩到一行,然后就可以将问题转换到求最大子序列的和的问题,进一步求出问题的解,特别要注意数组的初始化问题,每次讲二维数组压缩到一维数组的时候,都要将数组初始化为0;然后进行压缩,每次压缩之后就可以取最大值,进而求出答案

代码:

#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>using namespace std;int arrsize;int arrnumber[105][105];int onedim[105];void trans(int srow ,int enrow )///将二维矩阵转化为一维的;然后求最大连续子序列的和{    memset(onedim,0,sizeof(onedim));    for ( int j = 0; j < arrsize; j++ )    {        for ( int i = srow; i<= enrow; i++ )        {            onedim[j] += arrnumber[i][j];        }    }}int maxsum ()///求最大连续子序列的和{    int bigsum[105];    memset(bigsum,0,sizeof(bigsum));    bigsum[0] = onedim[0];    for ( int i = 1; i < arrsize; i++ )    {        if ( bigsum[i-1] > 0) bigsum[i]=bigsum[i-1]+onedim[i];        else bigsum[i] = onedim[i];    }    int ans = 0;    for ( int i = 1; i < arrsize; i++ )    {        ans = max(ans,bigsum[i]);    }    return ans;}int main(){    //freopen("in.txt","r",stdin);    while ( cin >> arrsize )    {        for ( int i = 0; i < arrsize; i++ )        {            for ( int j = 0; j < arrsize; j++ )            {                cin >> arrnumber[i][j];            }        }        int ans = 0;        for ( int i = 0 ;i < arrsize; i++ )        {            for ( int j = i; j < arrsize; j++ )            {                trans(i,j);                ans = max(ans,maxsum());            }        }        cout << ans << endl;    }}



0 0
原创粉丝点击