A dynamic programming problem. This post shares a nice solution and explanation. Well, this article is simply an organization of this post and its first answer (also posted by me :-)).
I use s (same) to stand for the number of ways when the last two fences are painted with the same color (the last element of dp1 in the above post) and d (different) with d1 and d2 to stand for the last two elements of dp2 in the above post.
In each loop, dp1[i] = dp2[i - 1] turns into s = d2 and dp2[i] = (k - 1) * (dp2[i - 2] + dp2[i - 1]) becomes d2 = (k - 1) * (d1 + d2). Moreover, d1 needs to be set to the oldd2, which is recorded in s. So we have d1 = s.
Finally, the return value dp1[n - 1] + dp2[n - 1] is just s + d2.
The code is as follows.
1 class Solution { 2 public: 3 int numWays(int n, int k) { 4 if (n < 2 || !k) return n * k; 5 int s = k, d1 = k, d2 = k * (k - 1); 6 for (int i = 2; i < n; i++) { 7 s = d2; 8 d2 = (k - 1) * (d1 + d2); 9 d1 = s; 10 } 11 return s + d2; 12 } 13 };
原文:http://www.cnblogs.com/jcliBlogger/p/4783051.html