題目要求
地牢由m x n房間在2維網格。我們英勇的騎士(k)最初定位在左上的房間,要到達地牢右下角拯救公主。騎士有乙個初始健康點(乙個正整數)。如果在任何時候或低於他的健康點下降到0,他立即死亡。一些房間有惡魔守衛,所以騎士失去健康(負整數)進入這些房間,其他房間都是空的(0)或含有神奇的魔法球,增加騎士的健康(正整數)。
編寫乙個函式來確定騎士能夠拯救公主的最小初始健康。
解題思路
使用二維陣列h,h[i][j]表示騎士要想救出公主在改點時應具備的最低健康值。從後往前求解h,先求出邊界值, 再求解中間值,取往下走和往右走的最小值。
問題描述public int calculateminimumhp(int dungeon)
for(int i = col - 2; i >=0; i--)
for(int i = row - 2; i >=0; i--)
}return h[0][0];
}
給定乙個m x n網格充滿了非負數字,找到一條從左上角到右下角最小化所有數字的總和。
解題思路
思路一:使用動態規劃,建立二維陣列p,p[i][j]表示從左上角到改點的最小路徑。p[i][j] = grid[i][j] + math.min(p[i-1][j],p[i][j-1])
思路二:使用動態規劃,不使用陣列,直接修改原陣列。public int minpathsum(int grid)
for(int i = 1; i <= row-1; i++)
for(int i = 1; i <= row-1; i++)
}return p[row-1][col-1];
}
思路三:使用動態規劃,不使用二維陣列,直接修改原陣列。public int minpathsum(int grid) else
if (i != 0 && j == 0) else
if (i == 0 && j == 0) else }}
return
grid[m - 1][n - 1];
}
題目要求public int minpathsum(int grid)
for(int i = 1; i <= row-1; i++)
}return p[col-1];
}
解題思路
方法一:動態規劃+二維陣列
方法二:動態規劃+一維陣列public
intuniquepaths(int m, int n)
for(int j = 1; j < m; j++)
for(int i = 1; i < m; i++)
}return path[m-1][n-1];
}
題目描述public
intuniquepaths(int m, int n)
for(int i = 1; i < m; i++)
}return path[n-1];
}
與上題情況相似,只是一些網格中存在障礙用1表示,其他用0表示。
解題思路
法一:動態規劃+二維陣列
法二:動態規劃+一維陣列public
intuniquepathswithobstacles(int obstaclegrid)
for(int j = 1; j < m; j++)
for(int i = 1; i < m; i++)
}return path[m-1][n-1];
}
public
intuniquepathswithobstacles(int obstaclegrid)
for(int i = 1; i < m; i++)}}
return path[n-1];
}
動態規劃 DP陣列
動態規劃是通過找當前項和前一或幾項或後一或幾項的關係,從而對乙個陣列多次利用達到減少複雜度。1.當一串數可以不限次利用時,採用順序的方式迴圈 for j 0 j max n j 一維陣列 或者加乙個for k 0 k a i j k 二維陣列 2.當一串數的使用次數有限時用for k 0 k a i...
動態規劃 最大子陣列
解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...
牛牛與陣列 動態規劃
牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 但是思想是對的,n 1個數會受到n個數的貢獻 然後想一下如果第n位是乙個數 第n 1位是i的數值就是第n位是j ...