結果
| 問題 | No.1368 サイクルの中に眠る門松列 |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-05-26 16:12:22 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 73 ms / 2,000 ms |
| コード長 | 1,372 bytes |
| 記録 | |
| コンパイル時間 | 13,425 ms |
| コンパイル使用メモリ | 281,772 KB |
| 実行使用メモリ | 9,316 KB |
| 最終ジャッジ日時 | 2026-05-26 16:12:51 |
| 合計ジャッジ時間 | 15,458 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_1 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 15 |
ソースコード
package main
import . "fmt"
import . "os"
import bf "bufio"
func main() {
rd := bf.NewReader(Stdin)
wr := bf.NewWriter(Stdout)
defer wr.Flush()
var t int
Fscan(rd,&t)
for ; t > 0; t-- {
var n int
Fscan(rd,&n)
a := make([]int, n)
for i := range a {
Fscan(rd,&a[i])
}
kadomatsu := make([]bool, n)
for i := 0; i < n; i++ {
j := (i+1)%n
k := (i+2)%n
if a[i]<a[j] && a[j]>a[k] && a[i]!=a[k] {
kadomatsu[i] = true
}
if a[i]>a[j] && a[j]<a[k] && a[i]!=a[k] {
kadomatsu[i] = true
}
}
ans := 0
for i := 0; i < 3; i++ {
dp := make([]int, n+1)
for j := 0; j < n; j++ {
k := (j+i)%n
if j+3<len(dp)&&kadomatsu[k] {
dp[j+3] = max(dp[j+3],dp[j]+a[k])
}
if j+1<len(dp) {
dp[j+1] = max(dp[j+1],dp[j])
}
}
ans = max(ans,dp[n])
}
Fprintln(wr, ans)
}
}
/*
考察
動的計画法?
DP[i] ... 1番目からi-1番目までの要素で作られた門松列群の評価値の和の最大
i番目の要素を頭に門松列を作る
DP[i+3] = max(DP[i+3], DP[i]+A[i])
i番目の要素を頭に門松列を作らない・作れない
DP[i+1] = max(DP[i+1], DP[i])
1番目の要素からN番目の要素まででDP
2番目の要素からN+1番目(=1番目)の要素まででDP
3番目の要素からN+2番目(=2番目)の要素まででDP
と3回DPして求めればよさそう
*/
ID 21712