プロジェクトオイラー 問題18
三年になり、計算量や情報理論、プログラミングの使用など、面白い授業ばっかりで、友達ともあえて充実した大学生活を送れています!
どうも、マツケンです!
遅れましたが、書きます!
今回の問題↓
Problem 18 - PukiWiki
<考え方>
・下から一段ずつ比較していって、その都度二次元配列にその和の値を入れていく形。
・最初は14行目にある数値に対して隣接する15行目の数字の和のうち、大きいほうを二次元配列MAX_triangleに入れていく。
・次回以降、k+1行目のtriangleにある数値に対して、隣接するk行目のMAX_triangleの和のうち大きいほうを...という感じに頂点の数まで繰り返す。
・MAX_triangleの頂点の数値が求める数になる。<ソースコード>
#include<stdio.h> #include<time.h> int main(void){ clock_t start_clock, end_clock; int triangle[15][15]={ {75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {95,64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {17,47,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {18,35,87,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {20,04,82,47,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {19,01,23,75,03,34, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {88,02,77,73,07,63,67, 0, 0, 0, 0, 0, 0, 0, 0}, {99,65,04,28,06,16,70,92, 0, 0, 0, 0, 0, 0, 0}, {41,41,26,56,83,40,80,70,33, 0, 0, 0, 0, 0, 0}, {41,48,72,33,47,32,37,16,94,29, 0, 0, 0, 0, 0}, {53,71,44,65,25,43,91,52,97,51,14, 0, 0, 0, 0}, {70,11,32,28,77,73,17,78,39,68,17,57, 0, 0, 0}, {91,71,52,38,17,14,91,43,58,50,27,29,48, 0, 0}, {63,66,04,68,89,53,67,30,73,16,69,87,40,31, 0}, {04,62,98,27,23, 9,70,98,73,93,38,53,60,04,23}}; int MAX_triangle[14][14]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; int i,a,b,j; start_clock = clock(); for(i=0; i<14; i++){ a=triangle[13][i]+triangle[14][i]; b=triangle[13][i]+triangle[14][i+1]; if(a<b) MAX_triangle[13][i]=b; if(a>b) MAX_triangle[13][i]=a; } for(i=1; i<14; i++){ for(j=0; j<14-i; j++){ a=triangle[13-i][j]+MAX_triangle[14-i][j]; b=triangle[13-i][j]+MAX_triangle[14-i][j+1]; if(a>b) MAX_triangle[13-i][j]=a; if(b>a) MAX_triangle[13-i][j]=b; } } printf("最大値%d\n", MAX_triangle[0][0]); end_clock = clock(); printf("経過時間%f秒\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC); return 0; } //クリアー
<実行結果>
最大値1074 経過時間0.000000秒
なんか、「2か月前の自分は何でこんなプログラム書いたんだろう...」って思いました。もっとコンパクトにまとめたい!