三步法
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...