演算法競賽高階指南0 2 遞推與遞迴

2022-07-16 16:30:22 字數 1166 閱讀 4891

目錄

1. 實現指數型列舉 3

2. 遞迴實現組合型列舉 3

3. 遞迴實現排列型列舉 4

4. 費解的開關 5

5. strange towers of hanoi 6

6. sumdiv 8

7. 分型之城 10

從n個數中選任意多個數 並輸出

#include

using namespace std;

int n;

void dfs(int cur,int state);

int dy[4] = ;

void fun(int x,int y);

ll len = 1ll << (n - 1) , cnt = 1ll << (2 * n - 2);

// cnt為子問題點的數量   

len代表等級為

n時的圖形長度的一半  用於平移座標

auto pos = calc(n - 1 , m % cnt); //計算出

m點在子問題中的位置

auto x = pos.first ;

auto y = pos.second;

auto z = m / cnt; // z = 0 1 2 3 分別代表

m在左上 右上 右下 左下

if(z == 0) return ;  // 如果在第一部分的座標變換 (旋轉

->

翻轉 ->

平移)else if(z == 1) return ; // 二

else if(z == 2) return ; //三

else return ; //四

int main(){

int t;

scanf("%d",&t);

while(t--){

ll n , a, b;

scanf("%lld %lld %lld",&n , &a , &b);

auto ac = calc(n , a - 1);

auto bc = calc(n , b - 1);

double x = ac.first - bc.first , y = ac.second - bc.second;

printf("%.0lf\n", sqrt(x * x + y * y) * 10);

return 0;

《演算法高階指南》 0 2遞推與遞迴

總結 遞迴 遞推提高效率,其他題還好一些,此章解決了我之前對漢諾塔的疑惑,提公升了對二進位制表示狀態的理解,但最後一題分形之城還是有點模糊,在後續學習中常回頭。int qmi int a,int b 快速冪 return res int sum int p,int c 分治求sum int main...

《演算法競賽高階指南》0x02 遞迴與遞推 學習總結

感受 遞迴中的分形太簡單了,基本就是個找規律 遞迴,講一講分治 分治,即分而治之 個人認為,其實它和二分差不多 或者二分其實是它的一部分?二分和分治的區別,在我看來,是二分需要有決策單調性,而分治貌似不需要?借助分治,把答案的複雜度從n 2降級到nlogn 其中,還是二分的思路,先把問題的當前狀態一...

遞推實現指數型列舉 演算法競賽高階指南

從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資料範圍 1 n 15 ...