题目链接:http://codeforces.com/problemset/problem/698/A
题目分析: d[i][k] 表示第i天选择k这个活动 (k == 0表示休息, k == 1表示参加比赛, k == 2表示去健身) 所休息的最少天数
那么有当健身馆开放时选择健身的转移的状态为 d[i][2] = min(d[i-1][0], d[i-1][1]) , 但也可以选择休息
当有比赛的时选择比赛的状态转移为 d[i][1] = min(d[i-1][0], d[i-1][2]) , 同样可以选择休息
当健身馆关闭并且没有比赛的时候只能选择休息, 状态转移为: d[i][0] = min(d[i-1][0], d[i-1][1], d[i-1][2])+1
参考代码:
# -*- coding: utf-8 -*-
n = int(raw_input())
a = [0]+map(int, raw_input().split())
d = [[110]*3 for x in range(n+1)]
d[0][0] = d[0][1] = d[0][2] = 0
for i in range(1, n+1):
d[i][0] = min(d[i-1][0], d[i-1][1], d[i-1][2])+1
if a[i] == 1 or a[i] == 3:
d[i][1] = min(d[i-1][0], d[i-1][2])
if a[i] == 2 or a[i] == 3:
d[i][2] = min(d[i-1][0], d[i-1][1])
print min(d[-1][0], d[-1][1], d[-1][2])