アルゴリズム(初級)

ID

線形代数と固有値問題 ひととおり線形代数を学んだ後によむといいかもしれない。できれば、関数解析をちょっとやった後で。スペクトル分解とかの所は結構細かいところまで乗ってるので便利。へぇ、こんな方法でとけるのか、と。でも説明丁寧かといわれるとそ…

ID

単語 rank3::1~~4 --> http://d.hatena.ne.jp/kenta11626918/20111012/1318401749 rank2 --> http://d.hatena.ne.jp/kenta11626918/20111006/1317882668 rank1 -->http://d.hatena.ne.jp/kenta11626918/20111017/1318821771 C34CAFDF85FFCEB9929CD40BD14E730…

木について。

TopCoderではときどき頭混乱させるような木のデータが与えられるので、まとめ。 //consider to be i = 0-based {-1, 0, 0, 2, 2, 4, 4} //i = 3ばんめの2は、2番目に親があるよってことを示してる. int start = 0; for(int i = 0; i < sz; i++) { if(heap[i…

動的計画法(メモ化)の研究

再帰、メモ再帰、動的計画法とは? 有名な??階乗計算を例に取る。 //純粋な再帰。同じ引数を持つ関数を何度も何度も呼び出している。→むだやん。 #include <iostream> #include <cstdio> using namespace std; int fib(int n) { if(n<=1) return n; return fib(n-1)+ fib(n-2</cstdio></iostream>…

ループ特集

//[x,y] = [0,0]~[9,9]までの間で更新していく. for(int i = 0; i ans[k] = min(ans[k], sum); } } } //全探索 for(int i = 0; i int cnt = 0; while(cnt cnt++; } という風に、最後にcntをインクリメントさせるようにする。 例外は、 while(++cnt

深さ優先検索、再帰の実装の仕方まとめ。

//基本はこういう感じ。実際にはこれだと無限ループしてしまうので、条件分岐させる。 int solve(int i, int n) { solve(i+1, n+1); solve(i+1, n); return 0; } //何かの法則を見つけて再帰 そのまえに、再帰のおさらい。 int func(int n) { int ans = 1; i…

SRM440 div2 medium 迷路問題。

交差点を何回曲がったかを答える問題. class MazeWanderingEasy { public: int decisions(vector maze) { int row = maze.size(); int col = maze[0].length(); pii start, goal; //search start and goal point for(int i = 0; i Q; int dir[4][2] ={ {-1,…

日付関数

閏年か判定 bool isleap(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } 01:01:01とかになってたら、変換 sscanf(time, "%d:%d:%d", &hh, &mm, &ss); //string str = "01:01:01"とかなら、 for(int i = 0; i iss(str); iss >…

Member Pilot Round1 div2 medium

なかなか面白い問題で、人によって解き方多少違うと思う. 自分は(練習のために)キューを使いました.というか、キュー使わないと計算量がひどくなりそう. e.g) A B C ERDOS B D D E F G ans:: A:1 B:1 C:1 D:2 E:3 F:3 G ERDOS:0 vector calculateNumber…

衝突問題

SRM458 div2 medium ボールを衝突させるとき、 for(int i = 0; i

幅検索の注意.

SRM453.5 div2 medium int longestPath(vector maze, int startRow, int startCol, vector moveRow, vector moveCol) { int row = maze.size(); int col = maze[0].length(); int step[row][col]; //初期化 for(int i = 0; i > que; step[startRow][startCol…

二分法

SRM462 div2 medium 二分検索でもよく使う方法. seek //入力 low = 0; high = 100 while(1) { int mid; mid = (low+high)/2; int calc = ...; //何らかの処理(midを仮引数に関数の戻り値を使用) if(calc > seek) { ///中間の値が大きい->high(最大値)を下げ…

配列を交互に足す 番兵の有効活用

降順に並んだ配列が二つあるとする.サイズは同じとは限らない. 配列を作るときに0を仕込んでおく。(番兵) //0入れる前にa.size(), b.size()を確定させる. a: 7 5 4 2 0 b: 8 3 1 0 //交互に足していって、stop以上になるときの最小の要素数を返す. //…

#include

for_each 便利そうだけど当分使いそうもない。 template UnaryFunction for_each( InputIterator first, InputIterator last, UnaryFunction f ); template struct increment : public unary_function { //継承してる void operator()(T& x) { x++; } }; //x…

日付関数

閏年か判定 bool isleap(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } 01:01:01とかになってたら、変換 sscanf(time, "%d:%d:%d", &hh, &mm, &ss); //string str = "01:01:01"とかなら、 for(int i = 0; i iss(str); iss >…

リスト作成の際の注意

リスト作成して、ノードを挿入したい。 #include using namespace std; typedef struct _list { int data; struct _list *next; }MyList; class Node { public: Node(); ~Node(); private: MyList* m_head; public: void Insert(int num); void Disp(); }; N…

二分木の実装とか

ノードを構造体で表す typedef struct _node { int val; struct _node *lch; struct _node *rch; } node; 赤色注意。まだ、typedefしていないので、こう書かなければ、エラー 挿入 //x:挿入する数字 p:検索するノード node *insert(node *p, int x) { //ノ…

ソートの練習

直接選択法 int main() { int n; cin >> n; int *arr = new int[n]; for(int i = 0; i > arr[i]; } //ここから本題 for(int i = 0; i (arr, i, n); swap(arr[min], arr[i]); } for(int i = 0; i バブルソート int main() { int n; cin >> n; int *arr = new …

幅優先検索と深さ優先検索の骨格

深さ優先検索:再帰関数で深くまで。 関数1開始→関数1−1開始→関数1−1終了→関数1終了 なので、スタックと同じ. void dfs(int x, int y) { //...の条件のとき再帰せず、終了。 if(...) {...} //..の条件のとき再帰せず、終了。 if(..) {..} //再帰関数で…

迷路

char arr[N][M+1] = {"#S######.#", "......#..#", ".#.##.##.#", ".#........", "##.##.####", "....#....#", ".#######.#", "....#.....", ".####.###.", "....#...G#", }; で、迷路をする。最短距離を求めたい。 深さ優先検索すると、パンクするみたいな…

ul, olの組み方。

var li = ul.getElementsByTagName("li"); var liGroupLength = Math.ceil(li.length / 5); // 分割後のliGroupの数 var ulGroup = []; for (var i = 0; i