6 #define min(a, b) ((a) < (b) ? (a) : (b))
8 int grid
[100][100] = {0};
13 int minimal_risk(int x
, int y
)
16 if (x
< 0 || y
< 0 || x
>= maxx
|| y
>= maxy
)
19 if (cache
[y
][x
] != -1)
22 int d
= minimal_risk(x
, y
+1);
23 int r
= minimal_risk(x
+1, y
);
24 if (d
== -1 && r
== -1) {
25 printf("shouldn't happen\n");
28 cache
[y
][x
] = r
+ grid
[y
][x
];
30 cache
[y
][x
] = d
+ grid
[y
][x
];
32 cache
[y
][x
] = min(d
, r
) + grid
[y
][x
];
40 while ( (c
= getchar()) != EOF
) {
46 grid
[maxy
][x
++] = c
-'0';
50 for (int y
= 0; y
<maxy
; y
++)
51 for (int x
= 0; x
<maxx
; x
++)
53 cache
[maxy
-1][maxx
-1] = grid
[maxy
-1][maxx
-1];
55 printf("%d\n", minimal_risk(0, 0));