Skip to content

Commit 3d25a5c

Browse files
committedAug 18, 2022
feat: add solutions to lc problem: No.0276
No.0276.Paint Fence
1 parent 5e94a97 commit 3d25a5c

File tree

6 files changed

+164
-2
lines changed

6 files changed

+164
-2
lines changed
 

‎solution/0200-0299/0276.Paint Fence/README.md

+69-1
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,90 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:动态规划**
57+
58+
定义 $dp[i][0]$ 表示栅栏 $[0,..i]$ 且最后两个栅栏颜色不同的方案数,$dp[i][1]$ 表示栅栏 $[0,..i]$ 且最后两个栅栏颜色相同的方案数。
59+
60+
初始时 $dp[0][0]=k$。当 $i \ge 1$ 时,有:
61+
62+
$$
63+
\begin{cases}
64+
dp[i][0]=(dp[i-1][0]+dp[i-1]) \times (k-1)\\
65+
dp[i][1]=dp[i-1][0]
66+
\end{cases}
67+
$$
68+
69+
答案为 $dp[n-1][0] + dp[n-1][1]$。
70+
71+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是栅栏柱的数量。
72+
5673
<!-- tabs:start -->
5774

5875
### **Python3**
5976

6077
<!-- 这里可写当前语言的特殊实现逻辑 -->
6178

6279
```python
63-
80+
class Solution:
81+
def numWays(self, n: int, k: int) -> int:
82+
dp = [[0] * 2 for _ in range(n)]
83+
dp[0][0] = k
84+
for i in range(1, n):
85+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1)
86+
dp[i][1] = dp[i - 1][0]
87+
return sum(dp[-1])
6488
```
6589

6690
### **Java**
6791

6892
<!-- 这里可写当前语言的特殊实现逻辑 -->
6993

7094
```java
95+
class Solution {
96+
public int numWays(int n, int k) {
97+
int[][] dp = new int[n][2];
98+
dp[0][0] = k;
99+
for (int i = 1; i < n; ++i) {
100+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
101+
dp[i][1] = dp[i - 1][0];
102+
}
103+
return dp[n - 1][0] + dp[n - 1][1];
104+
}
105+
}
106+
```
107+
108+
### **C++**
109+
110+
```cpp
111+
class Solution {
112+
public:
113+
int numWays(int n, int k) {
114+
vector<vector<int>> dp(n, vector<int>(2));
115+
dp[0][0] = k;
116+
for (int i = 1; i < n; ++i) {
117+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
118+
dp[i][1] = dp[i - 1][0];
119+
}
120+
return dp[n - 1][0] + dp[n - 1][1];
121+
}
122+
};
123+
```
71124
125+
### **Go**
126+
127+
```go
128+
func numWays(n int, k int) int {
129+
dp := make([][]int, n)
130+
for i := range dp {
131+
dp[i] = make([]int, 2)
132+
}
133+
dp[0][0] = k
134+
for i := 1; i < n; i++ {
135+
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) * (k - 1)
136+
dp[i][1] = dp[i-1][0]
137+
}
138+
return dp[n-1][0] + dp[n-1][1]
139+
}
72140
```
73141

74142
### **...**

‎solution/0200-0299/0276.Paint Fence/README_EN.md

+52-1
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,64 @@ Note that painting all the posts red or all the posts green is invalid because t
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def numWays(self, n: int, k: int) -> int:
58+
dp = [[0] * 2 for _ in range(n)]
59+
dp[0][0] = k
60+
for i in range(1, n):
61+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1)
62+
dp[i][1] = dp[i - 1][0]
63+
return sum(dp[-1])
5764
```
5865

5966
### **Java**
6067

6168
```java
69+
class Solution {
70+
public int numWays(int n, int k) {
71+
int[][] dp = new int[n][2];
72+
dp[0][0] = k;
73+
for (int i = 1; i < n; ++i) {
74+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
75+
dp[i][1] = dp[i - 1][0];
76+
}
77+
return dp[n - 1][0] + dp[n - 1][1];
78+
}
79+
}
80+
```
81+
82+
### **C++**
83+
84+
```cpp
85+
class Solution {
86+
public:
87+
int numWays(int n, int k) {
88+
vector<vector<int>> dp(n, vector<int>(2));
89+
dp[0][0] = k;
90+
for (int i = 1; i < n; ++i) {
91+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
92+
dp[i][1] = dp[i - 1][0];
93+
}
94+
return dp[n - 1][0] + dp[n - 1][1];
95+
}
96+
};
97+
```
6298
99+
### **Go**
100+
101+
```go
102+
func numWays(n int, k int) int {
103+
dp := make([][]int, n)
104+
for i := range dp {
105+
dp[i] = make([]int, 2)
106+
}
107+
dp[0][0] = k
108+
for i := 1; i < n; i++ {
109+
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) * (k - 1)
110+
dp[i][1] = dp[i-1][0]
111+
}
112+
return dp[n-1][0] + dp[n-1][1]
113+
}
63114
```
64115

65116
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
int numWays(int n, int k) {
4+
vector<vector<int>> dp(n, vector<int>(2));
5+
dp[0][0] = k;
6+
for (int i = 1; i < n; ++i) {
7+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
8+
dp[i][1] = dp[i - 1][0];
9+
}
10+
return dp[n - 1][0] + dp[n - 1][1];
11+
}
12+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func numWays(n int, k int) int {
2+
dp := make([][]int, n)
3+
for i := range dp {
4+
dp[i] = make([]int, 2)
5+
}
6+
dp[0][0] = k
7+
for i := 1; i < n; i++ {
8+
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) * (k - 1)
9+
dp[i][1] = dp[i-1][0]
10+
}
11+
return dp[n-1][0] + dp[n-1][1]
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public int numWays(int n, int k) {
3+
int[][] dp = new int[n][2];
4+
dp[0][0] = k;
5+
for (int i = 1; i < n; ++i) {
6+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1);
7+
dp[i][1] = dp[i - 1][0];
8+
}
9+
return dp[n - 1][0] + dp[n - 1][1];
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Solution:
2+
def numWays(self, n: int, k: int) -> int:
3+
dp = [[0] * 2 for _ in range(n)]
4+
dp[0][0] = k
5+
for i in range(1, n):
6+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1)
7+
dp[i][1] = dp[i - 1][0]
8+
return sum(dp[-1])

0 commit comments

Comments
 (0)
Please sign in to comment.