1. 程式人生 > >暗黑字符串(遞推

暗黑字符串(遞推

ring blank 擴展 for iostream n-2 end 排列 fine

https://www.nowcoder.com/practice/7e7ccd30004347e89490fefeb2190ad2?tpId=85&&tqId=29853&rp=5&ru=/activity/oj&qru=/ta/2017test/question-ranking 題目

其實一開始想法是3^3 = 27減去ABC的排列3 X 2 X 1 = 6,也就是21種。但是從這個角度一直考慮下去,其實是錯的。

應該從n = 2的基礎上分析。首先n = 3是從n =2的基礎上擴展一位,首先我們假設後面兩位是不同的(比如C、A)的那只能後面兩位選其中一位。f(n) = 2 * f(n - 1)。但是考慮到最後兩位一樣的情況,f(n - 1)中有兩位相同的數量,是f(n - 2)數量的個數,因為必須和f(n-2)的最後一位一樣。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9 #include<set>
10 #include<vector>
11 #include<stack>
12 #include<queue>
13
#include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const int INF= 0x3f3f3f3f; 20 const int N=1e7+5; 21 22 ll dp[34]; 23 int n; 24 25 int main() 26 { 27 while(cin>>n) 28 { 29 30 dp[1
]=3; 31 dp[2]=9; 32 for(int i=3;i<=n;i++) 33 dp[i]=2*dp[i-1]+dp[i-2]; 34 cout<<dp[n]<<endl; 35 36 } 37 }

暗黑字符串(遞推