Advertisement
Guest User

Untitled

a guest
Sep 18th, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.25 KB | None | 0 0
  1. G(V,E)
  2.  
  3. G(V,E)
  4.  
  5. input: a triangular array T of n rows increasing in length from 1 to n
  6.  
  7. scratch = clone T[n-1]
  8. for y = n-2 downto 0
  9. for x = 0 to y-1
  10. scratch[x] = T[y][x] + max(scratch[x], scratch[x+1])
  11.  
  12. output: scratch[0]
  13.  
  14. $refarray;
  15. open TRIG, "input.txt";
  16. while(<TRIG>){
  17. $i++;
  18. $_ =~ s/^s+//g;
  19. $_ =~ s/s+$//g;
  20. @num=split(/s+/);
  21. for $j (0...$#num) {
  22. $refarray[$i]->[$j]=$num[$j];
  23. }
  24. }
  25. close TRIG;
  26. while($i>0){
  27. for $j (0...$i-2){
  28. if($refarray[$i]->[$j]>$refarray[$i]->[$j+1])
  29. {
  30. $refarray[$i-1]->[$j]+=$refarray[$i]->[$j];
  31. }
  32. else{
  33. $refarray[$i-1]->[$j]+=$refarray[$i]->[$j+1];
  34. }
  35. $total=$refarray[$i-1]->[$j]."t";
  36. }
  37. $i-=1;
  38. }
  39. print $total;
  40.  
  41. int MaximumSum(List<List<int>> values)
  42. {
  43. // Making a copy by values of all list and validating the data at same time.
  44. var numbers = new List<List<int>>();
  45. int index = 0;
  46. while ((index < values.Count) && (values[index] != null) && (values[index].Count == index + 1))
  47. {
  48. numbers.Add(new List<int>());
  49. for (int j = 0; j <= index; j++)
  50. numbers[index].Add(values[index][j]);
  51. index++;
  52. }
  53. if (index == values.Count)
  54. {
  55. /* Applying dinamic programming principles we can obtain the maximum value starting from the last row until the first one.
  56. * Storing only the optimum result until the specific value being analized.
  57. * At the end the value on the top of the triangle will be the maximum needed.
  58. */
  59. for (int row = numbers.Count - 2; row >= 0; row--)
  60. for (int col = 0; col <= row; col++)
  61. numbers[row][col] += (numbers[row + 1][col] > numbers[row + 1][col + 1]) ? numbers[row + 1][col] : numbers[row + 1][col + 1];
  62. return numbers[0][0];
  63. }
  64. else
  65. {
  66. throw new Exception("Invalid data");
  67. }
  68. }
  69.  
  70. t=%w{
  71. 1
  72. 2 1
  73. 3 2 1
  74. 4 3 2 1
  75. 5 4 3 2 1
  76. 1 2 3 4 5 10000
  77. }.map &:to_i
  78.  
  79. l = []
  80. i=1
  81.  
  82. loop do
  83. l.push t.slice!(0,i)
  84. i += 1
  85. break if t == []
  86. end
  87. trees = [0, 1].repeated_permutation(l.length-1).to_a.map! do |tree|
  88. [0].concat tree
  89. end
  90.  
  91. trees.map! do |tree|
  92. newt = []
  93. tree.each_with_index do |e, i|
  94. newt.push tree.slice(0, i+1).inject :+
  95. end
  96. newt
  97. end
  98.  
  99. rr = []
  100. trees.each do |t|
  101. r = 0
  102. t.each_with_index do |v, i|
  103. r += l[i][v]
  104. end
  105. rr.push r
  106. end
  107. p rr.max
  108.  
  109. f=open("triangle.txt", "r")
  110. triangle=eval("[["+f.read().replace(" ", ",").replace("n", "],[")[:-4]+"]]")
  111. f.close()
  112. for i in range(len(triangle)-2, -1, -1):
  113. for j in range(len(triangle[i])):
  114. triangle[i][j]+=max(triangle[i+1][j+1],triangle[i+1][j])
  115. del triangle[i+1]
  116. print triangle[0][0]
  117.  
  118. 1 ( 1 )
  119. 2 3 ( 2 3 )
  120. 4 5 6 ( 4 5 6 )
  121.  
  122. 1 ( 1 )
  123. 7 9 ( 7 9 )
  124.  
  125. t:"I"$'/:" "vs'read0`t;
  126. {(-2_x),enlist (1_mmax[2;last x])+last -1_x}/[count[t]-1;t]
  127. exit 0
  128.  
  129. $ time q tri.q -q
  130. 108146
  131.  
  132. real 0m0.018s
  133. user 0m0.010s
  134. sys 0m0.010s
  135.  
  136. // Read the sample data file, store as List<List<int>>
  137. def triangle = getClass().
  138. getResource('test_sample_data.txt'). // get the file resource
  139. text. // contents as string
  140. split('n'). // split into lines
  141. collect { line -> // collect rows
  142. line.split().collect { it as int } // collect columns
  143. }
  144.  
  145. println "Recursive: ${findLargestWeightRecursively(triangle)}"
  146. println "Bottom up: ${findLargestWeightBottomUp(triangle)}"
  147.  
  148. def findLargestWeightRecursively(List triangle, row = 0, col = 0) {
  149. def current = triangle[row][col]
  150. if (row < triangle.size() - 1) {
  151. def w1 = findLargestWeightRecursively(triangle, row + 1, col)
  152. def w2 = findLargestWeightRecursively(triangle, row + 1, col + 1)
  153. return Math.max(w1, w2) + current
  154. } else {
  155. return current
  156. }
  157. }
  158.  
  159. def findLargestWeightBottomUp(List triangle) {
  160. def weights = triangle[triangle.size() - 1].clone()
  161. for (int row = triangle.size() - 2; row >= 0; row--) {
  162. def nextRow = triangle[row]
  163. for (int col = 0; col < nextRow.size(); col++) {
  164. def largest = Math.max(weights[col], weights[col + 1])
  165. weights[col] = nextRow[col] + largest
  166. }
  167. weights.remove(weights.size() - 1)
  168. }
  169. return weights[0]
  170. }
  171.  
  172. Recursive: 108146
  173. Bottom up: 108146
  174.  
  175. package com.euler.problems;
  176.  
  177. import java.util.*;
  178.  
  179. public class Problem18
  180. {
  181. private static Map<Integer,List<Integer>> triangle = new HashMap<Integer,List<Integer>>();
  182.  
  183. public static void main(String args[])
  184. {
  185. _init();
  186. int res = maxSum(triangle);
  187. System.out.println("Sum = "+res);
  188. }
  189.  
  190. //max sum from top to bottom of right angled triangle
  191. public static int maxSum(Map<Integer,List<Integer>> triangle)
  192. {
  193. int sum = 0;
  194. if(triangle == null || triangle.isEmpty())
  195. return 0;
  196. int size = triangle.size();
  197. if(size == 1)
  198. return triangle.get(0).get(0);
  199. int i=size-2,tmp,tmp_max,max_value;
  200. while(i>=0)
  201. {
  202. List<Integer> current_row = new ArrayList<Integer>();
  203. current_row = triangle.get(i);
  204. for(int index=0; index<current_row.size(); index++)
  205. {
  206. tmp = current_row.get(index);
  207. tmp_max = tmp+triangle.get(i+1).get(index);
  208. max_value = tmp+triangle.get(i+1).get(index+1);
  209. if(tmp_max > max_value)
  210. max_value = tmp_max;
  211. current_row.set(index,max_value);
  212. }
  213. triangle.put(i,current_row);
  214. current_row = null;
  215. i--;
  216.  
  217. }
  218. return triangle.get(0).get(0);
  219. }
  220.  
  221. private static void _init()
  222. {
  223. List<List<Integer>> tuples = new ArrayList<List<Integer>>();
  224. tuples.add(Arrays.asList(75));
  225. tuples.add(Arrays.asList(95,64));
  226. tuples.add(Arrays.asList(17,47,82));
  227. tuples.add(Arrays.asList(18,35,87,10));
  228. tuples.add(Arrays.asList(20,4,82,47,65));
  229. tuples.add(Arrays.asList(19,1,23,75,3,34));
  230. tuples.add(Arrays.asList(88,2,77,73,7,63,67));
  231. tuples.add(Arrays.asList(99,65,4,28,6,16,70,92));
  232. tuples.add(Arrays.asList(41,41,26,56,83,40,80,70,33));
  233. tuples.add(Arrays.asList(41,48,72,33,47,32,37,16,94,29));
  234. tuples.add(Arrays.asList(53,71,44,65,25,43,91,52,97,51,14));
  235. tuples.add(Arrays.asList(70,11,33,28,77,73,17,78,39,68,17,57));
  236. tuples.add(Arrays.asList(91,71,52,38,17,14,91,43,58,50,27,29,48));
  237. tuples.add(Arrays.asList(63,66,4,68,89,53,67,30,73,16,69,87,40,31));
  238. tuples.add(Arrays.asList(4,62,98,27,23,9,70,98,73,93,38,53,60,4,23));
  239. int i=0;
  240. for(List<Integer> tuple : tuples)
  241. {
  242. triangle.put(i++,tuple);
  243. }
  244. //print
  245. for(Integer key : triangle.keySet())
  246. {
  247. System.out.println(triangle.get(key));
  248. }
  249. }
  250. }
  251.  
  252. maximizeTree tree
  253. | length tree == 1 = head . head $ tree
  254. | otherwise = maximizeTree (take (length tree - 2) tree ++ [zipWith (a b -> maximum a + b) (pairUpList . last $ tree) (tree !! (length tree - 2))])
  255. where pairUpList list = [[list !! n, list !! (n + 1)] | n <- [0 .. (length list - 2)]]
  256.  
  257. maximizeTree [[5], [9, 6], [4, 6, 8], [0, 7, 1, 5]]
  258.  
  259. from io import open
  260. import os
  261.  
  262. def is_int(val):
  263. try:
  264. int(val)
  265. return True
  266. except:
  267. return False
  268.  
  269. class TriangleMaxTotal(object):
  270. def __init__(self, triangle_file_path):
  271. self.triangle_file_path = triangle_file_path
  272. self.max_sums = [0]
  273.  
  274. def find_triangle_max_total(self):
  275. with open(self.triangle_file_path, "r") as f:
  276. for line in f:
  277. self.max_sums = self._process_line(line)
  278.  
  279. self.max_sums.sort()
  280. return str(self.max_sums[-1])
  281.  
  282. def _process_line(self, line):
  283. utf = line.encode('utf8')
  284. new_max_sums = [int(num) for num in utf.split(' ') if is_int(num)]
  285.  
  286. # Calculate the first and last max sums
  287. new_max_sums[0] += self.max_sums[0]
  288. new_max_sums[-1] += self.max_sums[-1]
  289.  
  290. # Calculate all of the middle max sums
  291. for i in range(1, (len(new_max_sums)-1)):
  292. val = new_max_sums[i]
  293. a = self.max_sums[i-1]
  294. b = self.max_sums[i]
  295. new_max_sums[i] = val + (a if a > b else b)
  296.  
  297. return new_max_sums
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement