hdu1081-To The Max

来源:互联网 发布:阿里云mysql备份 编辑:程序博客网 时间:2024/05/21 17:23

http://acm.hdu.edu.cn/showproblem.php?pid=1081

DP,最大矩阵和,首先将横坐标的数值,分别求和存储在二维数组中,然后使用三个for循环,第一二层分别表示第I 横层 ,和第j 横层,然后做差,就求出了纵坐标的和,当sum〉0就由k 向右累加;

#include<iostream>#include<cstdio>#include<cstring>using namespace std ;int dp[ 150 ][ 150 ] ;int main(){int n ;int i , j , k , t , maxn ;while( ~scanf( "%d" , &n ) ){memset( dp , 0 , sizeof( dp ) );for( i = 0 ; i < n ; ++i )for( j = 0 ; j < n ; ++j ){scanf( "%d" , &t ) ;dp[ i ][ j ] = dp[ i - 1 ][ j ] + t ;}maxn = -1 ;for( i = 0 ; i < n ; ++i )for( j = i ; j < n ; ++j ){int sum = 0 ;for( k = 0 ; k < n ; ++k ){t = dp[ j ][ k ] - dp[ i - 1 ][ k ] ; sum += t ;if( sum < 0 )sum = 0 ;if ( sum > maxn )maxn = sum ;}}printf( "%d\n" , maxn ) ;}return 0 ;}