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
1 0 1
0 1 0
1 0 0
Sample Output
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的主要内容,如果未能解决你的问题,请参考以下文章