POJ 1050 To the Max(最大矩陣)
阿新 • • 發佈:2020-09-12
題目連結:http://poj.org/problem?id=1050
和序列中無長度限制的最大子段和相同,如果當前的sum>0,那麼它還有一定的價值,所以繼續往上累加;如果當前sum<0,即sum不僅沒有價值,反而會使後面的和更小,所以將sum重置為0為最優。
矩陣中維護每一列上的字首和,列舉所選矩陣上限i,下限j,列舉列數k,重複上述過程,記錄整個過程中的最大值即為答案。
AC程式碼:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std;AC程式碼5 const int N=105; 6 int n,maxx; 7 int a[N][N]; 8 int main(){ 9 while(~scanf("%d",&n)){ 10 memset(a,0,sizeof(a)); 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=n;j++){ 13 int t; 14 scanf("%d",&t); 15 a[i][j]=a[i-1][j]+t; 16} 17 int sum=0; 18 maxx=0; 19 for(int i=1;i<=n;i++) 20 for(int j=i;j<=n;j++){ 21 sum=0; 22 for(int k=1;k<=n;k++){ 23 int t=a[j][k]-a[i-1][k]; 24 sum+=t; 25 if(sum<0) sum=0; 26 if(sum>maxx) maxx=sum; 27 } 28 } 29 printf("%d\n",maxx); 30 } 31 return 0; 32 }