演算法競賽寶典 遞迴演算法

2021-09-26 04:59:30 字數 3396 閱讀 2591

/*p1498 南蠻圖騰

#include #include #include using namespace std;

int n;

char a[5][5],b[3000+10][3000+10];

int main()

*//*p1049 裝箱問題

#include using namespace std;

int a[30+1];

int main()

return 0;

}*//*p1885 moo(錯誤)

#include #include using namespace std;

int n,len=0;

string a;

string f(int k);

int len(int k);

int main()

}}string f(int k)

return a=f(k-1)+b+f(k-1);

}}*/

/*p1464 function(有bug,沒找到)

#include #include using namespace std;

#define ll long long int

ll w(ll a,ll b,ll c);

ll x[25][25][25];

int main()

}f(1);

coutint n,m,sum= 0;

void f(int k,int step);

int main()

if(f(n,m)==1) cout<<"yes"<#include using namespace std;

int n;

int a[1000+10][1000+10];

int f(int x,int y);

int main()

}for(int i=1;i<=n;i++)

}coutreturn left+a[x][y];

else

return right+a[x][y];}*/

/*求子集的位運演算法

#include using namespace std;

int n;

void f(int n);

int main()

f(1);

return 0;

}void f(int k)

}else sum++;

}int main()

int sum=0;

for(int i=1;i<=5;i++)

int x=5;

cout<<(x^sum)<>,|^(按優先順序排列)

位運算子的優先性很低,必須加括號

按位與運算子:&

如果兩個相應的位都為1,則該位的結果值為1,否則為0

0&0=0;0&1=0;1&0=0;1&1=1;

按位與運算通常用於二進位製取位操作

乙個數&1的結果就是取二進位制的最末位,可以用來判斷乙個整數的奇偶

按位或運算子:|

如果兩個相應的位有乙個為1,則該位的結果值為1,否則為0

0|0=0;0|1=1;1|0=1;1|1=1;

按位或運算通常用於二進位制特定位上的無條件賦值

乙個數|1的結果就是把二進位制最末尾強行變為一,乙個數|1之後再減1就可以把這個數變成最接近原數的偶數

異或運算子:^

如果兩個相應的位同號,則該位的結果值為0,否則為1

0^0=0;0^1=1;1^0=1;1^1=0;

兩次異或同乙個數最後結果不變,異或運算可以用於簡單的加密

異或可以交換兩個整數(侷限性極大)

相同數字異或結果為0,0異或任何數就等於任何數

取反運算子:~

所有位都取反,1變成0,0變成1

正數a變負數,無符號型變成-a,有符號型變成-a-1

負數b變正數,無符號型無負數,有符號型變成-b-1

左移運算子:<<

a<>

a>>b,表示所有的二進位制位整體向右移動b位,前面b位用0補充

a>>1,相當於a/2

只能用於正數

*//*n皇后問題

abs是求整型資料絕對值的函式,標頭檔案是math.h,stdlib.h

fab是求浮點型數絕對值的函式,標頭檔案是math.h

#include #include #include using namespace std;

int n,a[20];

int try(int x,int y);

void f(int x);

int main()

void f(int x)

*//*分形圖2(有錯誤,未解決)

#include #include #include #include using namespace std;

int n;

char a[10][10];

char b[1000+10][1000+10];

void f(int k,int x,int y);

int main()

}int m;

cin>>m;

int len=pow(n*1.0,m);

for(int i=1;i<=len;i++)

}f(m,1,1);

for(int i=1;i<=len;i++)

}f(n,1,1);

for(int i=1;i<=m;i++)

;void f(int n,int k);

int main()

cout<=num[k])

if(i<=n)

}}}*/

/*地盤劃分的優化遞迴演算法

#include using namespace std;

int sum=0;

int f1(int x,int y);

int f2(int x,int y);

int main()

if(y%x==0) return y/x;

else

}int f1(int x,int y)

if(y%x==0) return sum=sum+y/x;

else

}*//*地盤劃分的樸素遞迴演算法

#include using namespace std;

int sum=0;

int f(int x,int y);

int main()

else

return sum;

}}*/

/*棋子移動

#include using namespace std;

int f(int n);

int main()

int f(int n)

}*/

演算法競賽寶典 遞迴演算法 八皇后

八皇后問題,是乙個古老而著名的問題,是 回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發...

演算法競賽寶典 分治演算法 花費

二分解決,學習了 includeusing namespace std int a 100000 10 int n 天數 int m 規定的分組數 判斷用當前的mid值能把天數n分成幾組 通過比較group與m的大小,對mid值進行優化 int binary int key return cnt i...

sincerit 演算法競賽寶典 放蘋果

放蘋果 問題描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 遞迴解法 思考 當n m時 至少有n m個盤子為空 分法數為m個蘋果放入m個盤子 solve m,m 當n m時 有兩種分法 有盤子為空 solve m,n 1...