擅长排列的小明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   

 

posted @ 2016-05-04 08:26  X-POWER  阅读(191)  评论(0编辑  收藏  举报