解説。 距離は整数しか取り得ないので、1距離づつ考えることにします。 まずは、簡単のため、大砲がないケースを考えます。 光遺血ちゃんは前方にしか進めないため、dp[i]を距離iまでの最小コストとすると、dp[i]=dp[i-1]+1ということになります。 これは、dp[i+1]=dp[i]+1と言い換えることが出来ます。 次に、砲台がある場合を考えます。 始点がiの砲台jを使う場合、iまでの最小コストが決まっているものとすると、 dp[i+R[j]]=dp[i]+1 となります。 徒歩も、砲台も、後方に移動することができないため、前から順に最小コストを見ていけば、訪れた点の最小コストは確定しています。(ただし、砲台の射程が0である可能性があることに注意してください) 以上をコードに書くと以下のようになります。(入力や変数宣言は省略) FILL DP,INF DP[0]=0 FOR I=0 TO L FOR J=0 TO N-1 IF D[j]==I&&DP[I+R[j]]>DP[I]+1 THEN DP[i+R[j]]=DP[i]+1 ENDIF NEXT J IF DP[i+1]>DP[i]+1 THEN DP[i+1]=DP[i] ENDIF NEXT I