BZOJ 1057: [ZJOI2007]妫嬬洏鍒朵綔 鎮嚎娉曟眰鏈€澶у瓙鐭╅樀+dp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1057: [ZJOI2007]妫嬬洏鍒朵綔 鎮嚎娉曟眰鏈€澶у瓙鐭╅樀+dp相关的知识,希望对你有一定的参考价值。

鏍囩锛?/p>

1057: [ZJOI2007]妫嬬洏鍒朵綔

Description

鍥介檯璞℃鏄笘鐣屼笂鏈€鍙よ€佺殑鍗氬紙娓告垙涔嬩竴锛屽拰涓浗鐨勫洿妫嬨€佽薄妫嬩互鍙婃棩鏈殑灏嗘鍚屼韩鐩涘悕銆傛嵁璇村浗闄呰薄妫嬭捣婧愪簬鏄撶粡鐨勬€濇兂锛屾鐩樻槸涓€涓?*8澶у皬鐨勯粦鐧界浉闂寸殑鏂归樀锛屽搴斿叓鍏叚鍗佸洓鍗︼紝榛戠櫧瀵瑰簲闃撮槼銆傝€屾垜浠殑涓讳汉鍏皬Q锛屾鏄浗闄呰薄妫嬬殑鐙傜儹鐖卞ソ鑰呫€備綔涓轰竴涓《灏栭珮鎵嬶紝浠栧凡涓嶆弧瓒充簬鏅€氱殑妫嬬洏涓庤鍒欙紝浜庢槸浠栬窡浠栫殑濂芥湅鍙嬪皬W鍐冲畾灏嗘鐩樻墿澶т互閫傚簲浠栦滑鐨勬柊瑙勫垯銆傚皬Q鎵惧埌浜嗕竴寮犵敱N*M涓鏂瑰舰鐨勬牸瀛愮粍鎴愮殑鐭╁舰绾哥墖锛屾瘡涓牸瀛愯娑傛湁榛戠櫧涓ょ棰滆壊涔嬩竴銆傚皬Q鎯冲湪杩欑绾镐腑瑁佸噺涓€閮ㄥ垎浣滀负鏂版鐩橈紝褰撶劧锛屼粬甯屾湜杩欎釜妫嬬洏灏藉彲鑳界殑澶с€備笉杩囧皬Q杩樻病鏈夊喅瀹氭槸鎵句竴涓鏂瑰舰鐨勬鐩樿繕鏄竴涓煩褰㈢殑妫嬬洏锛堝綋鐒讹紝涓嶇鍝锛屾鐩樺繀椤婚兘榛戠櫧鐩搁棿锛屽嵆鐩搁偦鐨勬牸瀛愪笉鍚岃壊锛夛紝鎵€浠ヤ粬甯屾湜鍙互鎵惧埌鏈€澶х殑姝f柟褰㈡鐩橀潰绉拰鏈€澶х殑鐭╁舰妫嬬洏闈㈢Н锛屼粠鑰屽喅瀹氬摢涓洿濂戒竴浜涖€備簬鏄皬Q鎵惧埌浜嗗嵆灏嗗弬鍔犲叏鍥戒俊鎭绔炶禌鐨勪綘锛屼綘鑳藉府鍔╀粬涔堬紵

Input

绗竴琛屽寘鍚袱涓暣鏁癗鍜孧锛屽垎鍒〃绀虹煩褰㈢焊鐗囩殑闀垮拰瀹姐€傛帴涓嬫潵鐨凬琛屽寘鍚竴涓狽 * M鐨?1鐭╅樀锛岃〃绀鸿繖寮犵煩褰㈢焊鐗囩殑棰滆壊锛?琛ㄧず鐧借壊锛?琛ㄧず榛戣壊锛夈€?/p>

Output

鍖呭惈涓よ锛屾瘡琛屽寘鍚竴涓暣鏁般€傜涓€琛屼负鍙互鎵惧埌鐨勬渶澶ф鏂瑰舰妫嬬洏鐨勯潰绉紝绗簩琛屼负鍙互鎵惧埌鐨勬渶澶х煩褰㈡鐩樼殑闈㈢Н锛堟敞鎰忔鏂瑰舰鍜岀煩褰㈡槸鍙互鐩镐氦鎴栬€呭寘鍚殑锛夈€?/p>

Sample Input

3 3
1 0 1
0 1 0
1 0 0

Sample Output

4
6

HINT

 

 瀵逛簬100%鐨勬暟鎹紝N, M ≤ 2000

 

Source

 

棰樿В锛?/strong>

瀵逛簬绗竴闂紝鎴戜滑绠€鍗旸P灏卞ソ浜?/p>

绗簩闂細http://blog.csdn.net/clove_unique/article/details/50512624

銆€銆€鎮嚎娉曟眰鏈€澶у瓙鐭╅樀杩欎箞缁忓吀鎴戜笉閫?/p>

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2000+20, M = 30005, mod = 1e9+9, inf = 0x3f3f3f3f;
typedef long long ll;
//涓嶅悓涓?锛岀浉鍚屼负0
int dp[N][N],a[N][N],n,m,L[N][N],R[N][N],H[N][N];
void solve() {
    for(int i=1;i<=n;i++) {
        L[i][1] = 0;
        for(int j=2;j<=m;j++) L[i][j] = (L[i][j-1]+1)*(a[i][j]^a[i][j-1]);
        R[i][m] = 0;
        for(int j=m-1;j>=1;j--) R[i][j] = (R[i][j+1]+1)*(a[i][j]^a[i][j+1]);
    }
    for(int i=1;i<=m;i++) H[1][i]=1;
    for(int i=2;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            if(a[i-1][j]^a[i][j]) {
                H[i][j] = H[i-1][j]+1;
                L[i][j] = min(L[i-1][j],L[i][j]);
                R[i][j] = min(R[i-1][j],R[i][j]);
            }
            else H[i][j] = 1;
        }
    }
    int ans = 0;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            ans=max(ans,H[i][j]*(R[i][j]+L[i][j]+1));
        }
    }
    cout<<ans<<endl;
}
void DP() {
    for(int i=1;i<=m;i++) dp[n][i] = 1;
    for(int i=1;i<=n;i++) dp[i][m] = 1;
    int ans = 0;
    for(int i=n-1;i>=1;i--) {
        for(int j=m-1;j>=1;j--) {
            if(a[i][j]!=a[i+1][j]&&a[i][j]!=a[i][j+1]&&a[i][j]==a[i+1][j+1]) {
                dp[i][j] = min(dp[i+1][j],min(dp[i][j+1],dp[i+1][j+1])) +1;
                ans = max(ans,dp[i][j]);
            }
            else dp[i][j] = 1;
        }
    }
    cout<<ans*ans<<endl;
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
    DP();
    solve();
}

 

以上是关于BZOJ 1057: [ZJOI2007]妫嬬洏鍒朵綔 鎮嚎娉曟眰鏈€澶у瓙鐭╅樀+dp的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1057: [ZJOI2007]棋盘制作

BZOJ 1057: [ZJOI2007]棋盘制作

Bzoj1057 [ZJOI2007]棋盘制作

bzoj1057: [ZJOI2007]棋盘制作

BZOJ1057:[ZJOI2007]棋盘制作——题解

bzoj1057 [ZJOI2007]棋盘制作