結果

問題 No.2100 [Cherry Alpha C] Two-way Steps
ユーザー ID 21712
提出日時 2025-05-10 00:50:09
言語 Go
(1.23.4)
結果
AC  
実行時間 248 ms / 2,000 ms
コード長 1,189 bytes
コンパイル時間 12,381 ms
コンパイル使用メモリ 236,604 KB
実行使用メモリ 16,588 KB
最終ジャッジ日時 2025-05-10 00:50:32
合計ジャッジ時間 21,464 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 48
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import . "fmt"
import . "os"
import bf "bufio"

func main() {
	rd := bf.NewReader(Stdin)
	var n,m int
	Fscan(rd,&n,&m)
	h := make([]int, n+1)
	for i := range h[1:] {
		Fscan(rd,&h[i+1])
	}
	g := make([][]int, n+1)
	for i := 0; i < m; i++ {
		var x, y int
		Fscan(rd,&x,&y)
		g[x] = append(g[x], y)
		g[y] = append(g[y], x)
	}
	
	dp0 := make([]int, n+1)
	dp1 := make([]int, n+1)
	for i := range dp0 {
		dp0[i] = -1
		dp1[i] = -1
	}
	dp0[1] = 0
	for i := 1; i < n; i++ {
		if dp0[i] < 0 && dp1[i] < 0 {
			continue
		}
		for _, e := range g[i] {
			if e < i {
				continue
			}
			if h[i] > h[e] {
				dp0[e] = max(dp0[e], dp0[i], dp1[i])
			} else if dp0[i] >= 0 {
				dp1[e] = max(dp1[e], dp0[i]+(h[e]-h[i]))
			}
		}
	}
	Println(max(dp0[n], dp1[n]))

	dp0 = make([]int, n+1)
	dp1 = make([]int, n+1)
	for i := range dp0 {
		dp0[i] = -1
		dp1[i] = -1
	}
	dp0[n] = 0
	for i := n; i > 1; i-- {
		if dp0[i] < 0 && dp1[i] < 0 {
			continue
		}
		for _, e := range g[i] {
			if e > i {
				continue
			}
			if h[i] > h[e] {
				dp0[e] = max(dp0[e], dp0[i], dp1[i])
			} else if dp0[i] >= 0 {
				dp1[e] = max(dp1[e], dp0[i]+(h[e]-h[i]))
			}
		}
	}
	Println(max(dp0[1], dp1[1]))

}
0