---
# System prepended metadata

title: 2184. Number of Ways to Build Sturdy Brick Wall
tags: [Leetcode, Dynamic Programming, Bit Manipulation, Medium]

---

# 2184. Number of Ways to Build Sturdy Brick Wall
###### tags: `Leetcode` `Medium` `Dynamic Programming` `Bit Manipulation`
Link: https://leetcode.com/problems/number-of-ways-to-build-sturdy-brick-wall/
## 思路
首先generate出来每一层所有有可能的mask(mask当中记录每个brick的结束位置)
然后再用dp计算出答案
## Code
```java=
class Solution {
    public int buildWall(int height, int width, int[] bricks) {
        List<Integer> masks = new ArrayList<>();
        getAllMasks(width, bricks, 0, 0, masks);
        int[][] dp = new int[height][1024];
        for(int mask:masks) dp[0][mask]=1;
        for(int i=1; i<height; i++){
            for(int mask:masks){
                for(int prevMask:masks){
                    if((mask&prevMask)==0) dp[i][mask] = (dp[i-1][prevMask]+dp[i][mask])%1000000007;
                }
            }
        }
        int ans = 0;
        for(int mask:masks){
            ans = (ans+dp[height-1][mask])%1000000007;
        }
        return ans;
    }
    private void getAllMasks(int width, int[] bricks, int mask, int currWidth, List<Integer> masks){
        if(currWidth==width){
            masks.add(mask);
        }
        else{
            for(int brick:bricks){
                if(currWidth+brick>width) continue;
                if(currWidth+brick<width) mask += 1<<(currWidth+brick);
                getAllMasks(width, bricks, mask, currWidth+brick, masks);
                if(currWidth+brick<width) mask -= 1<<(currWidth+brick);
            }
        }
    }
}
```