• hihocoder编程练习赛52-2 亮灯方案


    思路:

    状态压缩dp。
    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int MAXN = 22;
     5 const int dx[4] = {0, 1, -1, 0};
     6 const int dy[4] = {1, 0, 0, -1};
     7 int n, m; 
     8 ll dp[(1 << 20) + 5];
     9 char a[MAXN][MAXN], tmp[MAXN][MAXN];
    10 bool check(int x, int y, int S)
    11 {
    12     for (int i = 0; i < 4; i++)
    13     {
    14         int nx = x + dx[i], ny = y + dy[i];
    15         if (nx >= 0 && nx < n && ny >= 0 && ny < m && (S & (1 << (nx * m + ny))))
    16             return true;
    17     }
    18     return false;
    19 }
    20 ll dfs(int now, int S)
    21 {
    22     if (dp[S] != -1) return dp[S];
    23     if (now == n * m) return 1;
    24     ll cnt = 0;
    25     for (int i = 0; i < n; i++)
    26     {
    27         for (int j = 0; j < m; j++)
    28         {
    29             int x = i * m + j;
    30             if (!(S & (1 << x)) && check(i, j, S))
    31                 cnt += dfs(now + 1, S | (1 << (i * m + j)));
    32         }
    33     }
    34     return dp[S] = cnt;
    35 }
    36 
    37 int main()
    38 {
    39     cin >> n >> m;
    40     int now = 0, S = 0;
    41     for (int i = 0; i < n; i++)
    42         for (int j = 0; j < m; j++)
    43             cin >> a[i][j];
    44     for (int i = 0; i < n; i++)
    45     {
    46         for (int j = 0; j < m; j++)
    47         {
    48             if (a[i][j] == '1') 
    49             {
    50                 now++;
    51                 S |= (1 << i * m + j);
    52             }
    53         }
    54     }    
    55     memset(dp, -1, sizeof dp);
    56     cout << dfs(now, S) << endl;
    57     return 0;
    58 }
  • 相关阅读:
    方法重载
    构造方法:(特殊方法,用来创建对象 没写就会默认有构造方法)
    java:第十二章
    java:第九章
    java:第十四章
    java:第十五章
    java:第十一章
    I/O小结
    java:第八章
    java:第六章
  • 原文地址:https://www.cnblogs.com/wangyiming/p/8644813.html
Copyright © 2020-2023  润新知