Project Euler 18
DP の練習。
- new 演算子で配列を生成すると、その要素は規定値で初期化される。
- たとえば int の配列の場合は 0 で初期化される。
- Linq 少しずつ慣れてきた。
- map は Select
- filter は Where
- reduce は Aggregate
int.Parse
で文字列から整数へ変換。
using System; using System.Collections.Generic; using System.IO; using System.Linq; class PE018 { static int Calc(List<List<int>> table) { int n = table.Count; int[,] dp = new int[n, n]; dp[0, 0] = table[0][0]; for (int i = 1; i < n; i++) { for (int j = 0; j <= i; j++) { int a = j > 0 ? dp[i-1, j-1] : 0; int b = dp[i-1, j]; dp[i, j] = table[i][j] + Math.Max(a, b); } } return Enumerable.Range(0, n).Select(i => dp[n-1, i]).Max(); } static void Main() { var table = new List<List<int>>(); foreach (string s in File.ReadAllLines("../data/18.txt")) { var xs = new List<int>(); string[] ds = s.Trim().Split(new char[] { ' ' }); foreach (string t in ds) { xs.Add(int.Parse(t)); } table.Add(xs); } Console.WriteLine(Calc(table)); } }
18.txt は以下です。
75 95 64 17 47 82 18 35 87 10 20 04 82 47 65 19 01 23 75 03 34 88 02 77 73 07 63 67 99 65 04 28 06 16 70 92 41 41 26 56 83 40 80 70 33 41 48 72 33 47 32 37 16 94 29 53 71 44 65 25 43 91 52 97 51 14 70 11 33 28 77 73 17 78 39 68 17 57 91 71 52 38 17 14 91 43 58 50 27 29 48 63 66 04 68 89 53 67 30 73 16 69 87 40 31 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
参考: