1 INT calculateMinimumHP(ベクトル<ベクトル< INT >>&地下牢){ 2 であれば(dungeon.size()= = 0 ) 3 リターン 0 。 4 INT end_x = dungeon.size() - 1 ; // 行 5 INT end_y =ダンジョン[ 0 ] .size() - 1 ; // 列 6 ベクトル<ベクトル< INT >> DP(dungeon.size()、ベクトル< INT >(ダンジョン[ 0 ] .size()))。 7 場合(ダンジョン[end_x】[end_y〕< 0) 8。 DP [end_x] [end_y] = - ダンジョン[end_x] [end_y]; 9 そう 10 DP [end_x] [end_y] = 0 ; 11 用(INT J = end_y- 。1 ; J> = 0 ; --j ) // 処理され、最後の行の各列に対して 12をある { 13は DP [end_x] [J] DP = [end_x] [+ J 。1 - ] ;ダンジョン[end_x] [J] 14 IF(DP [end_x] [J] < 0 ) 15 DP [end_x] [J]が= 0 ; 16 } 17 18である ため(int型私= end_x - 1。I> = 0 ; - I) 19 { 20 DP [I] [end_y] = DP [I + 1 ] [end_y] - ダンジョン[I] [end_y]。 21 であれば(DP [I] [end_y] < 0 ) 22 、DP [I] [end_y] = 0 ; 23 } 24 のための(int型 I = end_x - 1 ; I> = 0 ; - I) 25 { 26 のために(INT J = end_y - 1 ; J> = 0 ; -J) 27 { 28 DP [I] [J] =分(DP [I + 1 ] [j]は、DP [I]、[J + 1 ]) - ダンジョン[I] [J]。 29 であれば(DP [I] [J] < 0 ) 30 DP [I] [J] = 0 ; 31 } 32 } 33 リターン DP [ 0 ] [ 0 ] + 1 。 34 }
動的計画方程式
DP [I] [J] = MAX(1分(DP [I + 1] [j]は、DP [I]、[J + 1]) - ダンジョン[I] [J])。