There is a turtle in the left top corner of
rectangular table of size n × m. Each cell of the table contains some
amount of acid. Turtle can move right or down, its route terminates in right
bottom cell of the table.
Each milliliter of acid brings turtle some amount of
damage. Find the smallest possible value of damage that will receive a turtle
after a walk through the table.
Input. First line contains two positive integers n and m, no more than 1000 – the sizes of the table.
Then n lines are given, each contains m integers – the description of the table, each number given the
amount of acid in the cell (in milliliters).
Output. Print the minimum possible damage for the turtle.
Sample input |
Sample output |
3 4 5 9 4 3 3 1 6 9 8 6 8 12 |
35 |
dynamic programming
Let a[i][j] contains the amount of damage for the
turtle after visiting the cell (i, j). Let dp[i][j] contains the
minimum possible damage for the turtle during the route from (1, 1) to (i, j).
Consider the base cases:
·
dp[1][1] = a[1][1];
·
dp[i][1] = dp[i – 1][1] + a[i][1],
1 < i ≤ n (first column);
·
dp[1][j] = dp[1][j –
1] + a[1][j], 1 < j ≤ m (first row);
One can get into the cell (i, j)
either from (i – 1, j) or from (i, j –
1). Since the damage is
minimized, then
dp[i][j] = min(dp[i –
1][j], dp[i][j – 1]) + a[i][j]
First column:
·
dp[2][1] = dp[1][1] + a[2][1] = 5 + 3 = 8,
·
dp[3][1] = dp[2][1] + a[3][1] = 8 + 8 = 16.
First row:
·
dp[1][2] = dp[1][1] + a[1][2] = 5 + 9 = 14,
·
dp[1][3] = dp[1][2] + a[1][3] = 14 + 4 = 18.
Calculate the
values of some non-border cells:
dp[2][2] =
min(dp[1][2], dp[2][1]) + a[2][2] = min(14, 8) + 1 = 8 + 1 = 9
dp[3][4] =
min(dp[2][4], dp[3][3]) + a[3][4] = min(24, 23) + 12 = 23 + 12 = 35
The desired path
for the turtle is:
Exercise
Given matrix a[i][j], find the values of matrix dp[i][j].
Declare the arrays.
#define MAX 1010
int a[MAX][MAX], dp[MAX][MAX];
Read
the input data.
scanf("%d %d", &n, &m);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
Initialize
the first row and the first column of array dp.
dp[1][1] = a[1][1];
for (i = 2; i <= n; i++)
dp[i][1] = dp[i - 1][1] +
a[i][1];
for (j = 2; j <= m; j++)
dp[1][j] = dp[1][j - 1] +
a[1][j];
Find the minimum possible damage for the turtle for
each cell.
for (i = 2; i <= n; i++)
for (j = 2; j <= m; j++)
dp[i][j] = min(dp[i -
1][j], dp[i][j - 1]) + a[i][j];
Print
the answer.
printf("%d\n", dp[n][m]);
import java.util.*;
class Main
{
static int a[][] = new int[1001][1001];
static int dp[][] = new int[1001][1001];
public static void
main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
int m = con.nextInt();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = con.nextInt();
dp[1][1] = a[1][1];
for (int i = 2; i <= n; i++)
dp[i][1] = dp[i - 1][1] + a[i][1];
for (int j = 2; j <= m; j++)
dp[1][j] = dp[1][j-1] + a[1][j];
for (int i = 2; i <= n; i++)
for (int j = 2; j <= m; j++)
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
System.out.println(dp[n][m]);
con.close();
}
}