1050pku To the Max 解題報告
阿新 • • 發佈:2019-01-10
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
Output
Sample Input
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
Sample Output
15
解題思路:這個和一維陣列擷取一個欄位得到的最值是一一樣的,只是一維變成二維的,所以要對 資料進行處理,使得像一維資料那樣處理,用一個三維的陣列來儲存一個列裡,從i行到j行的和,然 後接著就是像一維陣列一樣從1~n列,只是這個不是一個數組而已,加了很多陣列,這樣就可以取他們 中最大的最大即可。(動態規劃) 程式碼如下:Code:
- #include<iostream>
- usingnamespace std;
- constint Max(101);
- int sum[Max][Max][Max]; //用來儲存在一個列裡,從i行到j行的和
- int main()
- {
- int n;
- while(cin>>n)
- {
- int data[Max][Max];
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=n;j++)
- {
- cin>>data[i][j];
- sum[i][i][j]=data[i][j]; //先初始化為自己那一格的值
- }
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=i+1;j<=n;j++)
- {
- for(int k=1;k<=n;k++)
- {
- sum[i][j][k]=sum[i][j-1][k]+data[j][k]; //計算出在k列從i行到j行的和
- }
- }
- }
- int MaxSum=-9999; //先讓初始化他們的最大值
- for(int i=1;i<=n;i++)
- {
- for(int j=i;j<=n;j++)
- {
- int temp=0;
- for(int k=1;k<=n;k++) //和一維陣列的得最大的段和是一樣的操作
- {
- if(temp>=0)
- temp+=sum[i][j][k];
- else
- temp=sum[i][j][k];
- if(temp>MaxSum)
- MaxSum=temp;
- }
- }
- }
- cout<<MaxSum<<endl;
- }
- return 0;
- }