[学習記録]AtCoder EDP C-Vacation[Go]

問題文

明日から太郎君の夏休みが始まります。 太郎君は夏休みの計画を立てることにしました。

夏休みは N 日からなります。 各 i (1≤i≤N) について、i 日目には太郎君は次の活動のうちひとつを選んで行います。

  • A: 海で泳ぐ。 幸福度 ai​ を得る。

  • B: 山で虫取りをする。 幸福度 bi​ を得る。

  • C: 家で宿題をする。 幸福度 ci​ を得る。

太郎君は飽き性なので、22 日以上連続で同じ活動を行うことはできません。

太郎君が得る幸福度の総和の最大値を求めてください。

解法

i 日目に 活動Aを行うときの幸福度は、i -1日目に活動B or 活動Cを行った時の最大値に幸福度を足したものになる

// 0 = A, 1 = B, 2 = C
max_a_h := Max(dp[i-1][1], dp[i-1][2])
dp[i][0] = max_a_h + sli[i][0]

活動B, Cについても同様に計算し、N日目まですべて計算する。
N日目の幸福度を計算した後、3つの最大値をとれば回答になる。

ans := Max(Max(dp[n-1][0], dp[n-1][1]), dp[n-1][2])


コード(AC)

func run() interface{} {
	n := readInt()

	sli := make([][]int, n)
	dp := make([][]int, n)
	for i := 0; i < n; i++ {
		sli[i] = readSli(3)
	}

	// banpei
	dp[0] = make([]int, 3)
	for i := 0; i < 3; i++ {
		dp[0][i] = sli[0][i]
	}

	for i := 1; i < n; i++ {
		dp[i] = make([]int, 3)
		// a=0, b=1, c=2
		max_a_h := Max(dp[i-1][1], dp[i-1][2])
		dp[i][0] = max_a_h + sli[i][0]

		max_b_h := Max(dp[i-1][0], dp[i-1][2])
		dp[i][1] = max_b_h + sli[i][1]

		max_c_h := Max(dp[i-1][1], dp[i-1][0])
		dp[i][2] = max_c_h + sli[i][2]
	}

	ans := Max(Max(dp[n-1][0], dp[n-1][1]), dp[n-1][2])
	return ans

この記事が気に入ったらサポートをしてみませんか?