Skip to content

Commit 64da87b

Browse files
committed
feat: add solutions to lc problem: No.0276
No.0276.Paint Fence
1 parent 5e94a97 commit 64da87b

File tree

6 files changed

+166
-2
lines changed

6 files changed

+166
-2
lines changed

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

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,92 @@
5353

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

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

5877
### **Python3**
5978

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

6281
```python
63-
82+
class Solution:
83+
def numWays(self, n: int, k: int) -> int:
84+
dp = [[0] * 2 for _ in range(n)]
85+
dp[0][0] = k
86+
for i in range(1, n):
87+
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) * (k - 1)
88+
dp[i][1] = dp[i - 1][0]
89+
return sum(dp[-1])
6490
```
6591

6692
### **Java**
6793

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

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

74144
### **...**

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

Lines changed: 52 additions & 1 deletion
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
### **...**
Lines changed: 12 additions & 0 deletions
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+
};
Lines changed: 12 additions & 0 deletions
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+
}
Lines changed: 11 additions & 0 deletions
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+
}
Lines changed: 8 additions & 0 deletions
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)