vijos 1055 奶牛浴场(最大子矩阵DP)

来源:互联网 发布:建淘宝优惠群网站 编辑:程序博客网 时间:2024/04/29 18:30

求最大子矩阵,用的王知昆的论文里的第一种方法

算法复杂度是0(s^2 )

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;struct Node{    int x, y;};int L, W;int N;Node node[5100];int cmp1( const void *a, const void *b ){    if( ((Node*)a)->x > ((Node*)b)->x ){        return 1;    }else{        return -1;    }}int cmp2( const void *a, const void *b ){    if( ((Node*)a)->y > ((Node*)b)->y ){        return 1;    }else{        return -1;    }}int solve(){    qsort( node, N, sizeof( Node ), cmp1 );    int h, l, ans;    ans = 0;    for( int i = 0; i < N; i++ ){        h = W;        l = 0;        for( int j = i + 1; j < N; j++ ){            ans = max( ans, ( node[j].x - node[i].x ) * ( h - l ) );            if( node[j].y >= node[i].y ) h = min( h, node[j].y );            if( node[j].y <= node[i].y ) l = max( l, node[j].y );            if( node[j].y == node[i].y ) break;        }        ans = max( ans, ( L - node[i].x ) * ( h - l ) );    }    for( int i = N - 1; i >= 0; i-- ){        h = W;        l = 0;        for( int j = i - 1; j >= 0; j-- ){            ans = max( ans, ( node[i].x - node[j].x ) * ( h - l ) );            if( node[j].y >= node[i].y ) h = min( h, node[j].y );            if( node[j].y <= node[i].y ) l = max( l, node[j].y );            if( node[j].y == node[i].y ) break;        }        ans = max( ans, ( node[i].x ) * ( h - l ) );    }    qsort( node, N, sizeof( Node ), cmp2 );    for( int i = 0; i < N - 1; i++ ){        ans = max( ans, L * ( node[i+1].y - node[i].y ) );    }    ans = max( ans, L * ( node[0].y ) );    ans = max( ans, L * ( W - node[N-1].y ) );    return ans;}int main(){    while( scanf( "%d%d", &L, &W ) != EOF ){        scanf( "%d", &N );        for( int i = 0; i < N; i++ ){            scanf( "%d%d", &node[i].x, &node[i].y );        }        printf( "%d\n", solve() );    }    return 0;}


0 0
原创粉丝点击