分治思想《演算法競賽入門經典》

2021-07-22 13:49:08 字數 2791 閱讀 5449

三步法

1,劃分問題

2,遞迴求解

3,合併問題

首相分治法可以用了優化最大連續和

優化後時間複雜度為o(nlogn)

第一步:利用m=x+(y-x)/2,設定劃分點。注意劃分格式為[x,m),[m,y),這樣不僅符合左邊去到右邊取不到的規範,而且不用m-1,m+1這些容易出錯的步驟。

第二步:劃分後近似相當於t(n)=2(n/2),然後對兩邊遞迴求解,最小不可分元素就是當一段連續和中只有乙個元素,所以當right-left=1時返回a[left],因為left能取到,right取不到。當不是最小元素時,就左右兩邊延長到底,和該段每個元素單個值比較,留下最大的,返回給上一層。

棋盤覆蓋問題

遞迴至邊長只有2的正方形,此時必有一塊已經被填,只需要將剩下三塊填完即可,大於兩塊將棋盤一分為四,有個象限含有初始的黑塊,將中心四塊中其它的三塊塗黑,然後繼續遞迴。

#include#include#include

#include#include

#include#include#include#includeusing namespace std;

const int inf = 0x3f3f3f3f;

int board[105][105];

int team = 1;

int pos(int

size, int a, int b, int x, int y)

void divide(int

size, int a, int b)}}

team++;

}else}}

int loc = pos(size, a, b, x, y);

for (int i = a + size / 2 - 1; i <= a + size / 2; i++)

}team++;

divide(size / 2, a, b);

divide(size / 2, a + size / 2, b + size / 2);

divide(size / 2, a + size / 2, b);

divide(size / 2, a, b + size / 2);

}}int main()

divide(size, 1, 1);

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

printf("\n");}}

return

0;}

迴圈日程表問題

思路通過temp控制每次方格的大小,來實現分治,

有規律可循,通過規律先對左下賦值

然後將左下複製到右上,

再將左上覆制到右下

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int board[105][105];

void solve(int k)

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

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

}

}}int main()

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

printf("\n");}}

return

0;}

巨人與鬼

題目大意是n個黑點,n個白點,乙個黑點連乙個白點(直線),如何使任意兩條直線都沒有相交。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int n;

struct node

points[1005];

bool cmp1(node a, node b)

bool cmp2(node a, node b)

void swap(int temp1, int temp2)

int ans[10005];

void swap(node a, node b)

void solve(int left, int right)

if (left >= right)

sort(points + left, points + right + 1, cmp1);

for (int i = left+1; i <= right; i++)

sort(points + left+1, points + right + 1, cmp2);

int sum = 0;

for (int i = left; i <= right; i++)

}}int main()

solve(1, 2*n);

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

printf("%d\n", ans[i]);

}return

0;}

演算法競賽入門經典 C 入門

include 提供輸入輸出流 include 提供常用演算法 using namespace std const int maxn 100 10 int a maxn int main return0 宣告陣列時,陣列大小可以用const宣告的常數。在c 中,這樣的寫法更加推薦。include i...

演算法競賽入門經典 1

想著要學演算法已經很長時間了,但一直都是有問題自己想,很少受 正規軍 編排,網上關於演算法的書倒是不少,其一必推 演算法導論 還有一本 演算法競賽入門經典 作者劉汝佳,好了,步入正題,兩天時間從第一章到第三章結尾,算是對c又進行了一遍複習,說一下新得 3d 3d 03d 知道它們的區別嗎,在呼叫pr...

演算法競賽入門經典 WERTYU

題目描述 把手放在鍵盤上時,稍不注意就會往右錯一 位。這樣,輸入q會變成輸入w,輸入j會變成輸 入k等。鍵盤如圖3 2所示。輸入乙個錯位後敲出的字串 所有字母均 大寫 輸出打字員本來想打出的句子。輸入保 證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母a。樣例輸入 o s,gomr ypf...