如果這個:
leadcode的Hot100系列--62. 不同路徑--簡單的動態規劃
看懂的話,那這題基本上是一樣的,
不同點在於:
1、這裡每條路徑相當於多了一個權值
2、結論不再固定,而是要比較不同走法哪個權值更小
針對第一點,需要把第一行和第一列的權值做一個累加:
假設這裡的權值都是1,則
A | B | C | D |
---|---|---|---|
E | F | G | H |
I | J | K | L |
中,f(A) 為1,f(B) 就為2,,因為A和B各有一個權值,f(C)為3,f(E) 為2,f(I)為3:
1 | 2 | 3 | 4 |
---|---|---|---|
2 | f(F) | f(G) | f(H) |
3 | f(J) | f(K) | f( L) |
要想 f(F) 小,則要比較f(B)和f(E)哪個小,所以 f(F) = min( f(F), f(E) ) + 1。
所以很容易得到動態方程:
f [i] [j] = min( f [i] [j-1] + f [i-1] [j] ) + 1 // i 代表行,j 代表列,最後加的1,是假設當前的點的權值是1
所以,每個點記錄的從開始到當前點的最小值。
int min(int a, int b)
{
return a<b?a:b;
}
int minPathSum(int** grid, int gridSize, int* gridColSize){
int p[gridSize][*gridColSize];
int sum = 0, i,j;
for (i=0; i<gridSize; i++) // 先算出第一列的權值
{
sum += grid[i][0];
p[i][0] = sum;
}
sum = 0;
for (i=0; i<*gridColSize; i++) // 先算出第一行的權值
{
sum += grid[0][i];
p[0][i] = sum;
}
for (i=1; i<gridSize; i++)
{
for (j=1; j<*gridColSize; j++)
{
p[i][j] = min(p[i][j-1], p[i-1][j]) + grid[i][j]; // 動態方程
}
}
return p[gridSize-1][*gridColSize-1];
}