URAL 1146 Maximum Sum & HDU 1081 To The Max (DP)

点我看题目

题意 : 给你一个n*n的矩阵,让你找一个子矩阵要求和最大。

思路 : 这个题都看了好多天了,一直不会做,今天娅楠美女给讲了,要转化成一维的,也就是说每一列存的是前几列的和,也就是说

 0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

处理后就是:
0  -2  -9  -9
9   11  5   7
-4 -3  -7  -6
-1  7   7   5

 1 #include <iostream>

 2 #include <stdio.h>

 3 #include <string.h>

 4 

 5 using namespace std;

 6 

 7 int sum[110][110] ;

 8 int main()

 9 {

10     int n ,m;

11     while(~scanf("%d",&n))

12     {

13         memset(sum,0,sizeof(sum)) ;

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

15         {

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

17             {

18                 scanf("%d",&m) ;

19                 sum[i][j] = sum[i-1][j]+m ;

20             }

21         }

22         int ans = -9999999 ;

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

24             for(int j = i ; j <= n ; j++)

25             {

26                 int cnt = 0 ;

27                 for(int k = 1 ; k <= n ; k ++)

28                 {

29                     cnt += sum[j][k]-sum[i-1][k] ;

30                     ans = max(cnt,ans) ;

31                     if(cnt < 0) cnt = 0 ;

32                 }

33             }

34         printf("%d",ans) ;

35     }

36     return 0;

37 }
View Code

 

你可能感兴趣的:(HDU)