#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
template < class S, class T> inline S max_L( S a,T b) {
return a>= b? a: b;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
long long mx[ 15 ] [ 15 ] ;
long long mn[ 15 ] [ 15 ] ;
class Solution{
public :
int maxProductPath( vector< vector< int >> & A) {
int i, j;
int x = A.size ( ) ;
int y = A[ 0 ] .size ( ) ;
mx[ 0 ] [ 0 ] = mn[ 0 ] [ 0 ] = A[ 0 ] [ 0 ] ;
for ( i= ( 1 ) ; i< ( x) ; i++ ) {
mx[ i] [ 0 ] = mn[ i] [ 0 ] = mn[ i- 1 ] [ 0 ] * A[ i] [ 0 ] ;
}
for ( j= ( 1 ) ; j< ( y) ; j++ ) {
mx[ 0 ] [ j] = mn[ 0 ] [ j] = mn[ 0 ] [ j- 1 ] * A[ 0 ] [ j] ;
}
for ( i= ( 1 ) ; i< ( x) ; i++ ) {
for ( j= ( 1 ) ; j< ( y) ; j++ ) {
mx[ i] [ j] = max_L( max_L( max_L( mx[ i- 1 ] [ j] * A[ i] [ j] , mn[ i- 1 ] [ j] * A[ i] [ j] ) , mx[ i] [ j- 1 ] * A[ i] [ j] ) , mn[ i] [ j- 1 ] * A[ i] [ j] ) ;
mn[ i] [ j] = min_L( min_L( min_L( mx[ i- 1 ] [ j] * A[ i] [ j] , mn[ i- 1 ] [ j] * A[ i] [ j] ) , mx[ i] [ j- 1 ] * A[ i] [ j] ) , mn[ i] [ j- 1 ] * A[ i] [ j] ) ;
}
}
if ( mx[ x- 1 ] [ y- 1 ] < 0 ) {
return - 1 ;
}
return mx[ x- 1 ] [ y- 1 ] % MD;
}
}
;
// cLay varsion 20200920-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// ll mx[15][15], mn[15][15];
//
// class Solution {
// public:
// int maxProductPath(vector<vector<int>>& A) {
// int x = A.size(), y = A[0].size();
// mx[0][0] = mn[0][0] = A[0][0];
// rep(i,1,x) mx[i][0] = mn[i][0] = mn[i-1][0] * A[i][0];
// rep(j,1,y) mx[0][j] = mn[0][j] = mn[0][j-1] * A[0][j];
// rep(i,1,x) rep(j,1,y){
// mx[i][j] = max(mx[i-1][j]*A[i][j], mn[i-1][j]*A[i][j], mx[i][j-1]*A[i][j], mn[i][j-1]*A[i][j]);
// mn[i][j] = min(mx[i-1][j]*A[i][j], mn[i-1][j]*A[i][j], mx[i][j-1]*A[i][j], mn[i][j-1]*A[i][j]);
// }
// if(mx[x-1][y-1] < 0) return -1;
// return mx[x-1][y-1] % MD;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTUQgKDEwMDAwMDAwMDdVKQp0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBUPiBpbmxpbmUgUyBtaW5fTChTIGEsVCBiKXsKICByZXR1cm4gYTw9Yj9hOmI7Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgbWF4X0woUyBhLFQgYil7CiAgcmV0dXJuIGE+PWI/YTpiOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KbG9uZyBsb25nIG14WzE1XVsxNV07CmxvbmcgbG9uZyBtblsxNV1bMTVdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG1heFByb2R1Y3RQYXRoKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIEEpewogICAgaW50IGksIGo7CiAgICBpbnQgeCA9IEEuc2l6ZSgpOwogICAgaW50IHkgPSBBWzBdLnNpemUoKTsKICAgIG14WzBdWzBdID0gbW5bMF1bMF0gPSBBWzBdWzBdOwogICAgZm9yKGk9KDEpO2k8KHgpO2krKyl7CiAgICAgIG14W2ldWzBdID0gbW5baV1bMF0gPSBtbltpLTFdWzBdICogQVtpXVswXTsKICAgIH0KICAgIGZvcihqPSgxKTtqPCh5KTtqKyspewogICAgICBteFswXVtqXSA9IG1uWzBdW2pdID0gbW5bMF1bai0xXSAqIEFbMF1bal07CiAgICB9CiAgICBmb3IoaT0oMSk7aTwoeCk7aSsrKXsKICAgICAgZm9yKGo9KDEpO2o8KHkpO2orKyl7CiAgICAgICAgbXhbaV1bal0gPW1heF9MKG1heF9MKG1heF9MKG14W2ktMV1bal0qQVtpXVtqXSwgbW5baS0xXVtqXSpBW2ldW2pdKSwgbXhbaV1bai0xXSpBW2ldW2pdKSwgbW5baV1bai0xXSpBW2ldW2pdKTsKICAgICAgICBtbltpXVtqXSA9bWluX0wobWluX0wobWluX0wobXhbaS0xXVtqXSpBW2ldW2pdLCBtbltpLTFdW2pdKkFbaV1bal0pLCBteFtpXVtqLTFdKkFbaV1bal0pLCBtbltpXVtqLTFdKkFbaV1bal0pOwogICAgICB9CiAgICB9CiAgICBpZihteFt4LTFdW3ktMV0gPCAwKXsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIG14W3gtMV1beS0xXSAlIE1EOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMDkyMC0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGxsIG14WzE1XVsxNV0sIG1uWzE1XVsxNV07Ci8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbWF4UHJvZHVjdFBhdGgodmVjdG9yPHZlY3RvcjxpbnQ+PiYgQSkgewovLyAgICAgaW50IHggPSBBLnNpemUoKSwgeSA9IEFbMF0uc2l6ZSgpOwovLyAgICAgbXhbMF1bMF0gPSBtblswXVswXSA9IEFbMF1bMF07Ci8vICAgICByZXAoaSwxLHgpIG14W2ldWzBdID0gbW5baV1bMF0gPSBtbltpLTFdWzBdICogQVtpXVswXTsKLy8gICAgIHJlcChqLDEseSkgbXhbMF1bal0gPSBtblswXVtqXSA9IG1uWzBdW2otMV0gKiBBWzBdW2pdOwovLyAgICAgcmVwKGksMSx4KSByZXAoaiwxLHkpewovLyAgICAgICBteFtpXVtqXSA9IG1heChteFtpLTFdW2pdKkFbaV1bal0sIG1uW2ktMV1bal0qQVtpXVtqXSwgbXhbaV1bai0xXSpBW2ldW2pdLCBtbltpXVtqLTFdKkFbaV1bal0pOwovLyAgICAgICBtbltpXVtqXSA9IG1pbihteFtpLTFdW2pdKkFbaV1bal0sIG1uW2ktMV1bal0qQVtpXVtqXSwgbXhbaV1bai0xXSpBW2ldW2pdLCBtbltpXVtqLTFdKkFbaV1bal0pOwovLyAgICAgfQovLyAgICAgaWYobXhbeC0xXVt5LTFdIDwgMCkgcmV0dXJuIC0xOwovLyAgICAgcmV0dXJuIG14W3gtMV1beS0xXSAlIE1EOwovLyAgIH0KLy8gfTsK