#include <bits/stdc++.h>
using namespace std;
typedef vector< int > vi;
typedef vector< vi> vvi;
typedef pair< int ,int > ii;
void print( vvi& v) {
for ( auto it: v) {
for ( auto jt: it)
cout << jt<< " " ;
cout << endl;
}
}
int getDiamon( vvi& mat) {
int n = mat.size ( ) ;
vvi dm( n,vi( n,INT_MIN ) ) ;
if ( mat[ 0 ] [ 0 ] == - 1 ) return 0 ;
dm[ 0 ] [ 0 ] = mat[ 0 ] [ 0 ] == 1 ? 1 : 0 ;
for ( int i= 1 ; i< n; i++ ) {
if ( mat[ 0 ] [ i] ! = - 1 && mat[ 0 ] [ i- 1 ] ! = - 1 )
dm[ 0 ] [ i] = mat[ 0 ] [ i] == 1 ? dm[ 0 ] [ i- 1 ] + 1 : dm[ 0 ] [ i- 1 ] ;
}
for ( int i= 1 ; i< n; i++ ) {
if ( mat[ i] [ 0 ] ! = - 1 && mat[ i- 1 ] [ 0 ] ! = - 1 )
dm[ i] [ 0 ] = mat[ i] [ 0 ] == 1 ? dm[ i- 1 ] [ 0 ] + 1 : dm[ i- 1 ] [ 0 ] ;
}
for ( int i= 1 ; i< n; i++ ) {
for ( int j= 1 ; j< n; j++ ) {
if ( mat[ i] [ j] ! = - 1 && ( dm[ i- 1 ] [ j] ! = INT_MIN || dm[ i] [ j- 1 ] ! = INT_MIN ) ) {
dm[ i] [ j] = mat[ i] [ j] == 1 ? 1 + max( dm[ i] [ j- 1 ] ,dm[ i- 1 ] [ j] ) : max( dm[ i] [ j- 1 ] ,dm[ i- 1 ] [ j] ) ;
}
}
}
//print(dm);
//now modify original matrix to reduce diamonds
int c = n- 1 , r = n- 1 ;
while ( c> 0 && r> 0 ) {
if ( mat[ r] [ c] == 1 )
mat[ r] [ c] = 0 ;
if ( dm[ r- 1 ] [ c] >= dm[ r] [ c- 1 ] )
r-- ;
else if ( dm[ r- 1 ] [ c] < dm[ r] [ c- 1 ] )
c-- ;
}
while ( c! = 0 ) {
if ( mat[ r] [ c] == 1 )
mat[ r] [ c] = 0 ;
c-- ;
}
while ( r! = 0 ) {
if ( mat[ r] [ c] == 1 )
mat[ r] [ c] = 0 ;
r-- ;
}
if ( mat[ 0 ] [ 0 ] == 1 ) mat[ 0 ] [ 0 ] = 0 ;
return dm[ n- 1 ] [ n- 1 ] ;
}
int main( ) {
int n; cin >> n;
vvi mat( n,vi( n) ) ;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
cin >> mat[ i] [ j] ;
}
}
int diam = getDiamon( mat) ;
cout << "diamonds in first iteration = " << diam<< endl;
cout << "After first iteration matrix is" << endl;
print( mat) ;
diam + = getDiamon( mat) ;
cout << "total diamonds collected are = " << diam<< endl;
cout << "After second iteration matrix is " << endl;
print( mat) ;
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPHZpPiB2dmk7CnR5cGVkZWYgcGFpcjxpbnQsaW50PiBpaTsKCnZvaWQgcHJpbnQodnZpJiB2KXsKCWZvcihhdXRvIGl0OnYpewoJCWZvcihhdXRvIGp0Oml0KQoJCQljb3V0PDxqdDw8IiAiOwoJCWNvdXQ8PGVuZGw7Cgl9Cn0KCmludCBnZXREaWFtb24odnZpJiBtYXQpewoJaW50IG4gPSBtYXQuc2l6ZSgpOwoJdnZpIGRtKG4sdmkobixJTlRfTUlOKSk7CQoJaWYobWF0WzBdWzBdPT0tMSlyZXR1cm4gMDsKCWRtWzBdWzBdID0gbWF0WzBdWzBdPT0xID8gMTowOwoKCWZvcihpbnQgaT0xO2k8bjtpKyspewoJCWlmKG1hdFswXVtpXSE9LTEgJiYgbWF0WzBdW2ktMV0hPS0xKQoJCQlkbVswXVtpXSA9IG1hdFswXVtpXT09MSA/IGRtWzBdW2ktMV0rMSA6IGRtWzBdW2ktMV07CQkJCgl9CgoJZm9yKGludCBpPTE7aTxuO2krKyl7CgkJaWYobWF0W2ldWzBdIT0tMSAmJiBtYXRbaS0xXVswXSE9LTEpCgkJCWRtW2ldWzBdID0gbWF0W2ldWzBdPT0xID8gZG1baS0xXVswXSsxIDogZG1baS0xXVswXTsJCQkKCX0KCglmb3IoaW50IGk9MTtpPG47aSsrKXsKCQlmb3IoaW50IGo9MTtqPG47aisrKXsKCQkJaWYobWF0W2ldW2pdIT0tMSAmJiAoZG1baS0xXVtqXSE9SU5UX01JTiB8fCBkbVtpXVtqLTFdIT1JTlRfTUlOKSl7CQkJCQoJCQkJZG1baV1bal0gPSBtYXRbaV1bal09PTEgPyAxK21heChkbVtpXVtqLTFdLGRtW2ktMV1bal0pIDogbWF4KGRtW2ldW2otMV0sZG1baS0xXVtqXSk7CgkJCX0KCQl9Cgl9CgkvL3ByaW50KGRtKTsKCgkvL25vdyBtb2RpZnkgb3JpZ2luYWwgbWF0cml4IHRvIHJlZHVjZSBkaWFtb25kcwoJaW50IGMgPSBuLTEsIHIgPSBuLTE7Cgl3aGlsZShjPjAgJiYgcj4wKXsKCQlpZihtYXRbcl1bY109PTEpCgkJCW1hdFtyXVtjXSA9IDA7CgkJaWYoZG1bci0xXVtjXT49ZG1bcl1bYy0xXSkKCQkJci0tOwoJCWVsc2UgaWYoZG1bci0xXVtjXTxkbVtyXVtjLTFdKQoJCQljLS07Cgl9Cgl3aGlsZShjIT0wKXsKCQlpZihtYXRbcl1bY109PTEpCgkJCW1hdFtyXVtjXSA9IDA7CgkJYy0tOwoJfQoJd2hpbGUociE9MCl7CgkJaWYobWF0W3JdW2NdPT0xKQoJCQltYXRbcl1bY10gPSAwOwoJCXItLTsKCX0KCWlmKG1hdFswXVswXT09MSltYXRbMF1bMF09MDsKCXJldHVybiBkbVtuLTFdW24tMV07Cn0KCgppbnQgbWFpbigpIHsJCglpbnQgbjtjaW4+Pm47Cgl2dmkgbWF0KG4sdmkobikpOwoJZm9yKGludCBpPTA7aTxuO2krKyl7CgkJZm9yKGludCBqPTA7ajxuO2orKyl7CgkJCWNpbj4+bWF0W2ldW2pdOwoJCX0KCX0KCWludCBkaWFtID0gZ2V0RGlhbW9uKG1hdCk7CQoJY291dDw8ImRpYW1vbmRzIGluIGZpcnN0IGl0ZXJhdGlvbiA9ICI8PGRpYW08PGVuZGw7Cgljb3V0PDwiQWZ0ZXIgZmlyc3QgaXRlcmF0aW9uIG1hdHJpeCBpcyI8PGVuZGw7CglwcmludChtYXQpOwoJZGlhbSArPSBnZXREaWFtb24obWF0KTsJCgljb3V0PDwidG90YWwgZGlhbW9uZHMgY29sbGVjdGVkIGFyZSA9ICI8PGRpYW08PGVuZGw7Cgljb3V0PDwiQWZ0ZXIgc2Vjb25kIGl0ZXJhdGlvbiBtYXRyaXggaXMgIjw8ZW5kbDsKCXByaW50KG1hdCk7CglyZXR1cm4gMDsKfQ==