擅长排列的小明II
先搜索 出来一点结果之后 看结果之间的 联系 得出 递推公式 .
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<limits.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<set> 10 #include<stack> 11 #include<string> 12 #include<sstream> 13 #include<map> 14 #include<cctype> 15 using namespace std; 16 int visited[60],result[60],flag,n; 17 void DFS(int mark) 18 { 19 if(mark==n) 20 flag++; 21 else 22 { 23 for(int i=2;i<=n;i++) 24 { 25 if(abs(i-result[mark])<=2&&!visited[i]) 26 { 27 result[mark+1]=i; 28 visited[i]=1; 29 DFS(mark+1); 30 visited[i]=0; 31 } 32 } 33 } 34 } 35 int main() 36 { 37 while(scanf("%d",&n)!=EOF) 38 { 39 memset(visited,0,sizeof(visited)); 40 visited[1]=result[1]=1; 41 flag=0; 42 DFS(1); 43 printf("%d\n",flag); 44 } 45 return 0; 46 }
可以通过一些 结果推出来 递推公式
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<limits.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<set> 10 #include<stack> 11 #include<string> 12 #include<sstream> 13 #include<map> 14 #include<cctype> 15 using namespace std; 16 int main() 17 { 18 int n,ac[57]={0,1,1,2}; 19 for(int i=4;i<=55;i++) 20 ac[i]=ac[i-1]+ac[i-3]+1; 21 while(~scanf("%d",&n)) 22 { 23 printf("%d\n",ac[n]); 24 } 25 return 0; 26 } 27