結果
| 問題 |
No.484 収穫
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-09-08 22:55:31 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 87 ms / 3,000 ms |
| コード長 | 1,201 bytes |
| コンパイル時間 | 15,460 ms |
| コンパイル使用メモリ | 227,236 KB |
| 実行使用メモリ | 67,248 KB |
| 最終ジャッジ日時 | 2024-09-08 22:55:49 |
| 合計ジャッジ時間 | 17,582 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
)
const INF int = 1e18
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
nums := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &nums[i])
}
memo := make([]int, n*n*2)
for i := range memo {
memo[i] = -1
}
var dfs func(l, r, isRight int) int
dfs = func(l, r, dir int) int {
if l == 0 && r == n-1 {
if dir == 0 {
return nums[0]
} else {
return nums[n-1]
}
}
hash := l*n*2 + r*2 + dir
if memo[hash] != -1 {
return memo[hash]
}
res := INF
if dir == 0 {
if l > 0 {
res = min(res, dfs(l-1, r, 0)+1)
}
if r < n-1 {
res = min(res, dfs(l, r+1, 1)+r-l+1)
}
res = max(res, nums[l])
} else {
if l > 0 {
res = min(res, dfs(l-1, r, 0)+r-l+1)
}
if r < n-1 {
res = min(res, dfs(l, r+1, 1)+1)
}
res = max(res, nums[r])
}
memo[hash] = res
return res
}
res := INF
for i := 0; i < n; i++ {
res = min(res, dfs(i, i, 0))
}
fmt.Fprintln(out, res)
}
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
}