Advertisement
Guest User

dsa hw5

a guest
Jun 16th, 2019
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i, j, k) for(int i = j; i < k; ++i)
  4. #define IOS cin.tie(0) , cout.sync_with_stdio(0)
  5. #define endl "\n"
  6. ///------------------------------------------------------------
  7. #define MAX 11
  8. #define mod 1000000007LL
  9.  
  10. int n , m;
  11. int c[MAX * MAX][MAX * MAX] , I[MAX][MAX] , _[MAX][MAX];
  12. int dp[MAX][MAX][MAX][MAX][MAX * MAX];
  13. string s[MAX];
  14.  
  15. inline void U(int &now , int val){
  16. now += val;
  17. if(now >= mod) now -= mod;
  18. }
  19. int DP(int l , int r , int a , int b , int k){
  20. if(dp[l][r][a][b][k] != -1) return dp[l][r][a][b][k];
  21. if(k == 0) return 1;
  22. if(l > r || a > b) return 0;
  23.  
  24. int &now = dp[l][r][a][b][k];
  25. now = 0;
  26.  
  27. REP(i , l , r + 1) if(_[i][b] - _[i][a - 1] == 0){
  28. if(i == l && i == r) continue;
  29. else if(i == l) U(now , DP(i + 1 , r , a , b , k - 1));
  30. else if(i == r) U(now , DP(l , i - 1 , a , b , k - 1));
  31. else {
  32. REP(ii , 0 , k){
  33. int v1 = DP(l , i - 1 , a , b , ii);
  34. int v2 = DP(i + 1 , r , a , b , k - 1 - ii);
  35. U(now , 1ll * c[k - 1][ii] * v1 % mod * v2 % mod);
  36. }
  37. }
  38. }
  39. REP(i , a , b + 1) if(I[r][i] - I[l - 1][i] == 0){
  40. if(i == a && i == b) continue;
  41. else if(i == a) U(now , DP(l , r , i + 1 , b , k - 1));
  42. else if(i == b) U(now , DP(l , r , a , i - 1 , k - 1));
  43. else {
  44. REP(ii , 0 , k){
  45. int v1 = DP(l , r , a , i - 1 , ii);
  46. int v2 = DP(l , r , i + 1 , b , k - 1 - ii);
  47. U(now , 1ll * c[k - 1][ii] * v1 % mod * v2 % mod);
  48. }
  49. }
  50. }
  51. return now;
  52. }
  53. int32_t main(){
  54. IOS;
  55. cin >> n >> m;
  56. REP(i , 0 , n) cin >> s[i];
  57.  
  58. memset(dp , -1 , sizeof dp);
  59.  
  60. REP(i , 1 , n + 1) REP(j , 1 , m + 1) I[i][j] = (s[i - 1][j - 1] == 'X' ? 1 : 0);
  61. REP(i , 1 , n + 1) REP(j , 1 , m + 1) I[i][j] += I[i - 1][j];
  62.  
  63. REP(i , 1 , n + 1) REP(j , 1 , m + 1) _[i][j] = (s[i - 1][j - 1] == 'X' ? 1 : 0);
  64. REP(i , 1 , n + 1) REP(j , 1 , m + 1) _[i][j] += _[i][j - 1];
  65.  
  66. REP(i , 0 , MAX * MAX) REP(j , 0 , i + 1){
  67. if(j == 0 || j == i) c[i][j] = 1;
  68. else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
  69. }
  70.  
  71. int ans = 0;
  72. REP(i , 0 , n * m + 1) U(ans , DP(1 , n , 1 , m , i));
  73.  
  74. cout << ans << endl;
  75. return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement