More Related Content
Similar to 20120127 nhn (11)
20120127 nhn
- 6. 1/1 1/2 ・・・ 6/30 7/1 7/2 ・・・ 12/30 12/31
7/1 7/2 ・・・ 9/30 10/1 10/2 ・・・ 12/30 12/31
7/1 7/2 ・・・ 8/14 8/15 8/16 ・・・ 9/29 9/30
- 7. #!/usr/bin/perl
use strict;
use warnings;
中間値を取ってきてその
my $MAX_LOOP = 9;
前後どちらにあるか判定
my $doy = 250; # 9/7
my ($min $max) = (0, 365);
my $ans;
for (1..$MAX_LOOP) {
計算量はO(log2n)
my $mid = int(($min+$max)/2);
if ($mid == $doy) {
$ans = $mid; 並列N分探索は強力
last;
}
elsif($mid > $doy) {
$max = $mid;
}
else {
$min = $mid;
}
}
print "ans: ", $ans, "n";
- 8. #!/usr/bin/perl
use strict;
use warnings;
中間値を取ってきてその
my $MAX_LOOP = 9;
前後どちらにあるか判定
my $doy = 250; # 9/7
my ($min $max) = (0, 365);
my $ans;
for (1..$MAX_LOOP) {
計算量はO(log2n)
my $mid = int(($min+$max)/2);
if ($mid == $doy) {
$ans = $mid; 並列N分探索は強力
last;
}
elsif($mid > $doy) {
$max = $mid;
}
else {
$min = $mid;
じわりじわりと攻めていく
}
}
print "ans: ", $ans, "n";
- 14. 2 4
1 3 5
時間
1.一番開始時間の早いものから見る
2.一番時間の短いものから見る
3.一番終了時間の早いものから見る
- 15. 2 4
1 3 5
時間
1.一番開始時間の早いものから見る
2.一番時間の短いものから見る
3.一番終了時間の早いものから見る
今、その時点で一番○○なものを
選んでいく
- 16. 2 4
1 3 5
時間
1.一番開始時間の早いものから見る
2.一番時間の短いものから見る
3.一番終了時間の早いものから見る
今、その時点で一番○○なものを
貪欲法
選んでいく
- 17. #!/usr/bin/perl
use strict;
use warnings;
終了時間でソート
# 映画のリスト
↓
my @movies = ([1,3], [2,5], [4,7], [6,9], [8,10]);
@movies = sort { $a->[1] <=> $b->[1] } @movies; 順番に今見ることが出来
my $ans = 0; るかを判定
my $end = 0; # 前回見た映画の終了時刻
↓
for my $movie (@movies) {
if ($movie->[0] > $end) { 見れるものがあれば見る
$ans++;
$end = $movie->[1];
}
} 計算量はO(n)
print "ans: ", $ans, "n";
- 18. #!/usr/bin/perl
use strict;
use warnings;
終了時間でソート
# 映画のリスト
↓
my @movies = ([1,3], [2,5], [4,7], [6,9], [8,10]);
@movies = sort { $a->[1] <=> $b->[1] } @movies; 順番に今見ることが出来
my $ans = 0; るかを判定
my $end = 0; # 前回見た映画の終了時刻
↓
for my $movie (@movies) {
if ($movie->[0] > $end) { 見れるものがあれば見る
$ans++;
$end = $movie->[1];
}
} 計算量はO(n)
print "ans: ", $ans, "n";
仕事も恋も貪欲さが大事
- 24. i番目の料理を食べるか食べないかで総当たり
→ 計算量はO(2^n)
i番目の料理を食べる、食べない、に分解
食べた時 食べない時
X-pi円でi番目以外の料 X円でi番目以外の料理で
理で最も量を食べたい 最も量を食べたい
- 25. i番目の料理を食べるか食べないかで総当たり
→ 計算量はO(2^n)
i番目の料理を食べる、食べない、に分解
食べた時 食べない時
X-pi円でi番目以外の料 X円でi番目以外の料理で
理で最も量を食べたい 最も量を食べたい
動的計画法
- 26. i番目の料理を食べるか食べないかで総当たり
→ 計算量はO(2^n)
i番目の料理を食べる、食べない、に分解
食べた時 食べない時
X-pi円でi番目以外の料 X円でi番目以外の料理で
理で最も量を食べたい 最も量を食べたい
動的計画法
一つ前や一つ後を考えたときに相似形が出てくる
ような問題はDPで解きやすい!
- 28. i番目(i=0∼n-1)までの料理をj万円以内で食
べた時の量の最大値をdp[i+1][j]とおく
i→i+1とするときの遷移を考えると、以下の
漸化式が導ける
dp[i][j] (j < v[i])
dp[i+1][j] = max(dp[i][j], dp[i][j-p[i]]+v[i]) (それ以
外)
- 29. #!/usr/bin/perl
use strict;
use warnings;
use List::Util qw(max);
my $n = 4; 計算量はたかだかO(nX)
my @p = (2, 1, 3, 2);
my @v = (3, 2, 4, 2);
my $X = 5;
my @dp = ([0, 0, 0, 0, 0, 0]);
for my $i (0..$n-1) {
for my $j (0..$X) {
if ($j < $p[$i]) {
$dp[$i+1][$j] = $dp[$i][$j];
}
else {
$dp[$i+1][$j]
= max($dp[$i][$j], $dp[$i][$j-$p[$i]] + $v[$i]);
}
}
}
print "max_v: ", $dp[$n][$X], "n";
- 30. #!/usr/bin/perl
use strict;
use warnings;
use List::Util qw(max);
my $n = 4; 計算量はたかだかO(nX)
my @p = (2, 1, 3, 2);
my @v = (3, 2, 4, 2);
my $X = 5;
my @dp = ([0, 0, 0, 0, 0, 0]);
for my $i (0..$n-1) {
for my $j (0..$X) {
if ($j < $p[$i]) {
$dp[$i+1][$j] = $dp[$i][$j];
}
else {
$dp[$i+1][$j]
= max($dp[$i][$j], $dp[$i][$j-$p[$i]] + $v[$i]);
}
}
}
print "max_v: ", $dp[$n][$X], "n";
過去の思い出は大切に
- 35. 3
2
9
8 10 4
1
11
12 この問題は左図のようなグラフで表される
7
5
(この場合は重み付き無向グラフ)
6
1.n以下の整数kを取る
2.(1∼k) (i,j)のグラフを考える
3.この時のi,j間の最短経路をpi,jとする
4.このグラフに地点k+1を加える
5.この時のi,j間の最短経路は以下のどちらか
- 36. 3
2
9
8 10 4
1
11
12 この問題は左図のようなグラフで表される
7
5
(この場合は重み付き無向グラフ)
6
1.n以下の整数kを取る
2.(1∼k) (i,j)のグラフを考える
3.この時のi,j間の最短経路をpi,jとする
4.このグラフに地点k+1を加える
5.この時のi,j間の最短経路は以下のどちらか
pi,jまたはpi,k+1+pk+1,j
- 37. 3
2
9 ワーシャルフロイド
8 10 4
1
11
12 この問題は左図のようなグラフで表される
7
5
(この場合は重み付き無向グラフ)
6
1.n以下の整数kを取る
2.(1∼k) (i,j)のグラフを考える
3.この時のi,j間の最短経路をpi,jとする
4.このグラフに地点k+1を加える
5.この時のi,j間の最短経路は以下のどちらか
pi,jまたはpi,k+1+pk+1,j
- 38. #!/usr/bin/perl
$p[$i][$j]は、
use strict;
use warnings;
直通の道あり → 2点間の距離d
my $n = 12; 直通の道なし → (十分大きな数)
my ($s, $g) = (2, 5);
my @p = init_p(); $i == $j →0
for my $k (1..$n) { で初期化する
for my $i (1..$n) {
for my $j (1..$n) {
if ($p[$i][$k] + $p[$k][$j] < $p[$i][$j]) {
$p[$i][$j] = $p[$i][$k] + $p[$k][$j];
}
}
}
}
print "ans: ", $p[$s][$g], "n";
計算量はO(n^3)
- 39. #!/usr/bin/perl
$p[$i][$j]は、
use strict;
use warnings;
直通の道あり → 2点間の距離d
my $n = 12; 直通の道なし → (十分大きな数)
my ($s, $g) = (2, 5);
my @p = init_p(); $i == $j →0
for my $k (1..$n) { で初期化する
for my $i (1..$n) {
for my $j (1..$n) {
if ($p[$i][$k] + $p[$k][$j] < $p[$i][$j]) {
$p[$i][$j] = $p[$i][$k] + $p[$k][$j];
}
}
}
}
print "ans: ", $p[$s][$g], "n";
計算量はO(n^3)
ときには遠回りも必要(?)
Editor's Notes
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- &#x9069;&#x7528;&#x4F8B;&#x306F;&#x30A8;&#x30EC;&#x30D9;&#x30FC;&#x30BF;&#x30FC;&#x3068;&#x304B;\n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- &#x5B9F;&#x7528;&#x4F8B;&#x3068;&#x3057;&#x3066;&#x30AB;&#x30FC;&#x30C9;&#x30B2;&#x30FC;&#x30E0;&#x306E;&#x6700;&#x5927;&#x30B3;&#x30B9;&#x30C8;&#x306B;&#x5BFE;&#x3059;&#x308B;&#x6226;&#x529B;&#x306E;&#x6700;&#x5927;&#x5316;&#x3001;&#x306A;&#x3069;\n
- \n
- \n
- \n
- \n
- \n
- \n
- &#x30C0;&#x30A4;&#x30AF;&#x30B9;&#x30C8;&#x30E9;&#x6CD5;&#x3068;&#x3044;&#x3046;&#x3082;&#x306E;&#x3082;&#x3042;&#x308B;&#x304C;&#x91CD;&#x307F;&#x304C;&#x8CA0;&#x306E;&#x6642;&#x306B;&#x304A;&#x304B;&#x3057;&#x304F;&#x306A;&#x308B;\n&#x3053;&#x308C;&#x306F;&#x7121;&#x5411;&#x30B0;&#x30E9;&#x30D5;&#x3060;&#x3063;&#x305F;&#x304C;&#x6709;&#x5411;&#x30B0;&#x30E9;&#x30D5;&#x3067;&#x3082;WF&#x306F;&#x9069;&#x7528;&#x53EF;&#x80FD;\n&#x5B9F;&#x7528;&#x4F8B;&#x306F;&#x4E57;&#x308A;&#x63DB;&#x3048;&#x6848;&#x5185;&#x3001;&#x306A;&#x3069;\n
- \n