package main import ( "fmt" ) func main() { n, m := 0, 0 for { num, _ := fmt.Scan(&n, &m) if num == 0 { break } else { arr := make([][]int, n) for i := 0; i < n; i++ { arr[i] = make([]int, m) for j := 0; j < m; j++ { fmt.Scan(&arr[i][j]) } } fmt.Println(process2(arr, n, m)) } } } func process2(arr [][]int, n, m int) int { dp := make([][]int, n) for i := 0; i < len(dp); i++ { dp[i] = make([]int, m) } for i := n - 1; i >= 0; i-- { for j := m - 1; j >= 0; j-- { if i == n-1 && j == m-1 { // 右下脚位置处,dp[i][j] + arr[i][j] >= 1 dp[i][j] = 1 - arr[i][j] } else if i == n-1 { // 最后一行位置处, // 血量需要满足大于1,大于需要的血量dp[i][j+1] minn := max(1, dp[i][j+1]) dp[i][j] = minn - arr[i][j] } else if j == m-1 { // 最后一列位置处, // 血量需要满足大于1,大于需要的血量dp[i+1][j] minn := max(1, dp[i+1][j]) dp[i][j] = minn - arr[i][j] } else { // 其他位置处, // 血量需要满足大于1,大于最小值(dp[i+1][j],dp[i][j+1]) minn := max(1, min(dp[i][j+1], dp[i+1][j])) dp[i][j] = minn - arr[i][j] } // 每个[i,j]位置处均不能小于1 if dp[i][j] < 1 { dp[i][j] = 1 } } } return dp[0][0] } func min(a, b int) int { if a < b { return a } return b } func max(a, b int) int { if a > b { return a } return b }