生活随笔
收集整理的這篇文章主要介紹了
第一章:递推与递归 【完结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目前,這一章都已經熟練掌握了。
目錄
- 92. 遞歸實現指數型枚舉 【板子題】
- 94. 遞歸實現排列型枚舉 【板子題】
- 93. 遞歸實現組合型枚舉【板子題】
- 717. 簡單斐波那契 【簡單 / 遞推】
- 95. 費解的開關 【二進制枚舉 / 遞推】
- 1208. 翻硬幣 【遞推】
- 116. 飛行員兄弟 【二進制枚舉 】
- 1209. 帶分數 【枚舉】
在用遞歸的時候可以先畫一個遞歸樹來分析。
92. 遞歸實現指數型枚舉 【板子題】
題目詳解
#include<bits/stdc++.h>
using namespace std
;
int a
[30],vis
[30],n
;
void dfs(int index
)
{if(index
==n
){for(int i
=0;i
<n
;i
++) if(vis
[i
]==1) cout
<<i
+1<<" ";cout
<<endl
;return;}vis
[index
]=1;dfs(index
+1);vis
[index
]=0;dfs(index
+1);
}
int main(void)
{cin
>>n
;dfs(0);return 0;
}
注意: 遞歸一定要恢復現場。
94. 遞歸實現排列型枚舉 【板子題】
題目詳解
#include<cstdio>
#include<iostream>
int state
[10];
bool m
[10];
int n
;
void dfs(int u
)
{if(u
==n
){for(int i
=0;i
<n
;i
++){printf("%d ",state
[i
]);}printf("\n");return;}for(int i
=1;i
<=n
;i
++){if(!m
[i
]){m
[i
]=true;state
[u
]=i
;dfs(u
+1);m
[i
]=false;state
[u
]=0;}}
}
int main(void)
{scanf("%d",&n
);dfs(0);return 0;
}
可以用現有的函數實現全排列
#include<cstdio>
#include<algorithm>
using namespace std
;
int a
[10]={1,2,3,4,5,6,7,8,9};
int main(void)
{int n
;scanf("%d",&n
);do{for(int i
=0;i
<n
;i
++){printf("%d ",a
[i
]);}printf("\n");}while(next_permutation(a
,a
+n
));return 0;
}
93. 遞歸實現組合型枚舉【板子題】
題目詳解
代碼如下:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std
;
int m
,n
;
int ways
[30];
void dfs(int u
,int start
)
{if(u
==m
+1){for(int i
=1;i
<=m
;i
++){printf("%d ",ways
[i
]);}puts("");return; }for(int i
=start
;i
<=n
;i
++){ways
[u
]=i
;dfs(u
+1,i
+1);ways
[u
]=0;}
}
int main(void)
{cin
>>n
>>m
;dfs(1,1);return 0;
}
#include<bits/stdc++.h>
using namespace std
;
int a
[30],vis
[30],n
,m
;
void dfs(int index
,int start
)
{if(index
==m
){for(int i
=0;i
<m
;i
++) cout
<<a
[i
]<<" ";cout
<<endl
;return;}for(int i
=start
;i
<=n
;i
++){if(!vis
[i
]){a
[index
]=i
;vis
[i
]=1;dfs(index
+1,i
);vis
[i
]=0;}}
}
int main(void)
{cin
>>n
>>m
;dfs(0,1);return 0;
}
717. 簡單斐波那契 【簡單 / 遞推】
#include<bits/stdc++.h>
using namespace std
;
const int N
=1010;
typedef long long int LL
;
LL a
[N
],n
;
int main(void)
{cin
>>n
;a
[1]=0,a
[2]=1;for(int i
=3;i
<=n
;i
++) a
[i
]=a
[i
-1]+a
[i
-2];for(int i
=1;i
<=n
;i
++) cout
<<a
[i
]<<" ";return 0;
}
95. 費解的開關 【二進制枚舉 / 遞推】
題目詳解
#include<bits/stdc++.h>
using namespace std
;
int a
[30][30],b
[30][30],n
;
int dx
[5]={0,-1,0,1,0};
int dy
[5]={0,0,1,0,-1};
void turn(int x
,int y
)
{for(int i
=0;i
<5;i
++){int tempx
=x
+dx
[i
];int tempy
=y
+dy
[i
];if(tempx
>=0&&tempx
<5&&tempy
>=0&&tempy
<5) b
[tempx
][tempy
]^=1;}
}
int dfs()
{int ans
=10;for(int k
=0;k
<32;k
++){int cnt
=0;memcpy(b
,a
,sizeof b
);for(int i
=0;i
<5;i
++) if(k
>>i
&1) turn(0,i
),cnt
++;for(int i
=1;i
<5;i
++)for(int j
=0;j
<5;j
++) if(!b
[i
-1][j
]) turn(i
,j
),cnt
++;bool flag
=true;for(int i
=0;i
<5;i
++) if(!b
[4][i
]) flag
=false; if(flag
) ans
=min(ans
,cnt
);}if(ans
>6) return -1;else return ans
;
}
int main(void)
{cin
>>n
;while(n
--){string s
[10];for(int i
=0;i
<5;i
++) cin
>>s
[i
];for(int i
=0;i
<5;i
++)for(int j
=0;j
<5;j
++)a
[i
][j
]=s
[i
][j
]-'0';cout
<<dfs()<<endl
;}return 0;
}
1208. 翻硬幣 【遞推】
題目詳解
#include<bits/stdc++.h>
using namespace std
;
string a
,b
;
int main(void)
{cin
>>a
>>b
;int ans
=0;for(int i
=1;i
<b
.size();i
++){if(b
[i
-1]!=a
[i
-1]){b
[i
-1]=a
[i
-1];if(b
[i
]=='*') b
[i
]='o';else b
[i
]='*';ans
++;}}cout
<<ans
;return 0;
}
116. 飛行員兄弟 【二進制枚舉 】
題目詳解
#include<bits/stdc++.h>
using namespace std
;
typedef pair
<int,int> PII
;
int a
[10][10],b
[10][10];
void turn(int x
,int y
)
{for(int i
=0;i
<4;i
++) b
[x
][i
]^=1,b
[i
][y
]^=1;b
[x
][y
]^=1;
}
int main(void)
{string s
[10];for(int i
=0;i
<4;i
++) cin
>>s
[i
];for(int i
=0;i
<4;i
++)for(int j
=0;j
<4;j
++)if(s
[i
][j
]=='+') a
[i
][j
]=0;else a
[i
][j
]=1;vector
<PII
> ans
;for(int i
=0;i
<(1<<16);i
++){vector
<PII
>temp
;memcpy(b
,a
,sizeof a
);for(int j
=0;j
<16;j
++){if( (i
>>j
) & 1 ){turn(j
/4,j
%4);temp
.push_back({j
/4,j
%4});}}bool flag
=true;for(int j
=0;j
<4;j
++)for(int k
=0;k
<4;k
++)if(!b
[j
][k
]) flag
=false;if(flag
&& ( ans
.size()>temp
.size() || ans
.empty() ) ) ans
=temp
;}cout
<<ans
.size()<<endl
;for(auto op
: ans
) cout
<<op
.first
+1<<" "<<op
.second
+1<<endl
;return 0;
}
1209. 帶分數 【枚舉】
詳細解析
#include<bits/stdc++.h>
using namespace std
;
int a
[10],ans
;
int get(int l
,int r
)
{int sum
=0;for(int i
=l
;i
<=r
;i
++) sum
=sum
*10+a
[i
];return sum
;
}
int main(void)
{int n
; cin
>>n
;for(int i
=1;i
<=9;i
++) a
[i
]=i
;do{for(int i
=1;i
<=7;i
++){for(int j
=i
+1;j
<=8;j
++){int a
=get(1,i
);if(a
>n
) continue;int b
=get(i
+1,j
);int c
=get(j
+1,9);if(b
%c
==0&&a
+b
/c
==n
) ans
++;}}}while(next_permutation(a
+1,a
+10));cout
<<ans
;return 0;
}
acwing會TLE 其它oj可以過
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std
;
int n
;
string s
="123456789";
int main(void)
{cin
>>n
;int cnt
=0;do{for(int i
=1;i
<=7;i
++){int a
=stoi(s
.substr(0,i
));if(a
>n
) continue;for(int j
=1;j
<=8-i
;j
++){int b
=stoi(s
.substr(i
,j
));int c
=stoi(s
.substr(i
+j
));if(b
%c
!=0) continue;else{if(a
+b
/c
==n
) cnt
++;}}}}while(next_permutation(s
.begin(),s
.end()));printf("%d\n",cnt
);return 0;
}
總結
以上是生活随笔為你收集整理的第一章:递推与递归 【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。