[DP] POJ1050

来源:互联网 发布:网络电视遥控器失灵 编辑:程序博客网 时间:2024/05/21 22:48

http://poj.org/problem?id=1050


找到n × n 数组里和最大的子长方形


将二维的数组转化为一维,再使用dp求最大子序列和


( ̄▽ ̄)感觉最开始就想错了hhhh

不应该一个一个子长方形列举再优化

而是整行或多行的操作

百度的码都看不懂hhhhh

还是cy写的好哇233


#include <cstring>#include <iostream>using namespace std;int a[ 101 ][ 101 ];int dp ( int tmp[], int n ) {        int max = 0;        int s = 0;        for ( int i = 1; i <= n; i++ ) {                s = ( s > 0 ) ? ( s + tmp[ i ] ) : tmp[ i ];                if ( max < s )                        max = s;        }        return max;}int Max ( int n ) {        int sum = -128;        for ( int i = 1; i <= n; i++ ) { //从第i行开始取起                int tmp[ 101 ];                memset ( tmp, 0, sizeof ( tmp ) );                for ( int j = i; j <= n; j++ ) { //取到第j行                        for ( int k = 1; k <= n; k++ ) { //将i--j行的所有第k列相加 变为一维的情况                                tmp[ k ] += a[ j ][ k ];                        }                        int s = dp ( tmp, n ); //调用一维“最大子序列和”的算法                        if ( sum < s )                                sum = s;                }        }        return sum;}int main () {        int n;        while ( cin >> n ) {                for ( int i = 1; i <= n; i++ )                        for ( int j = 1; j <= n; j++ )                                cin >> a[ i ][ j ];                cout << Max ( n ) << endl;        }        return 0;}


原创粉丝点击