Solution
/* Topcoder SRM */ /*****************************************************************************/ const int mod=1e9+7; long long solve(string c) { vector<int> x; for (int i=0; i<sz(c); i++) { if (c[i]!='.') { x.pb(i); } } int t=sz(x), n=sz(c); int d[t+1][n+1]; for (int i=t; i>=0; i--) { for (int p=n; p>=0; p--) { long &r=d[i][p]; if (i==t) { r=1; } else { int hi=n-(t-i), lo=p; c[x[i]]=='D'?lo=max(p, x[i]):hi=min(hi, x[i]); r=0; for (int j=lo; j<=hi; j++) { r+=d[i+1][j+1]; } r%=mod; } } } return d[0][0]; } int FoxAndShogi::differentOutcomes(vector <string> board) { int n=sz(board); long long r=1; for (int i=0; i<n; i++) { string c=""; for (int j=0; j<n; j++) { c+=board[j][i]; } r*=solve(c); r%=mod; } return r; } /*****************************************************************************/
No comments :
Post a Comment