Problem 3. Spaced Out
https://usaco.org/index.php?page=viewproblem2&cpid=1088
从小规模数据开始绘制,发现要么第一行确定后,每一行与上一行相反。要么第一列确定后,每一行与上一行相反。证明:首先考虑第一行存在连续的 11
或者 00
情况
我们用 f[j][0]
表示第一行第 j 列为 0 时,整个第 j
列的收益,f[j][1]
相反。
1n = int(input())2f = [[0, 0] for _ in range(n)]3v = [[0, 0] for _ in range(n)]4for i in range(n):5 s = list(map(int, input().split()))6 for j, x in enumerate(s):7 f[j][(i + 1) % 2] += x8 v[i][(j + 1) % 2] += x9
10ans1 = 011for x, y in f:12 ans1 += max(x, y)13ans2 = 014for x, y in v:15 ans2 += max(x, y)1 collapsed line
16print(max(ans1, ans2))
程序填空:
1n = int(input())2f = [[0, 0] for _ in range(n)]3v = [[0, 0] for _ in range(n)]4for i in range(n):5 s = list(map(int, input().split()))6 for j, x in enumerate(s):7 f[___][___] += x8 v[___][___] += x9
10ans1 = 011for x, y in f:12 ans1 += __13ans2 = 014for x, y in v:15 ans2 += ___1 collapsed line
16print(max(ans1, ans2))
Problem 3. Moo Route
大胆猜测如果能不改方向就不改。往右走如果遇到剩余次数为 0 就掉头。往左走如果左边剩余次数 <= 2 且右边还有可以走的就掉头。否则就回不来了。
1n = int(input())2a = list(map(int, input().split())) + [0]3s = sum(a)4p = 05d = 16for _ in range(s):7 if (d == 1 and a[p] == 0) or (d == -1 and a[p - 1] <= 2 and a[p] > 0):8 d = -d9 if d == 1:10 print("R", end='')11 a[p] -= 112 else:13 print("L", end='')14 a[p - 1] -= 115 p += d
读题 + 思考