变相
最优解法
可以发现,每一列能拿到的最多金币数取决于他上一列拿了多少金币。考虑动态规划
用代表位于第i列第j行最多可以赚多少金币,那么对于它可以被更新(如果对应的格子在跑道内)。
时间复杂度
因为需要开dp辅助数组。空间复杂度
int dp[100005][3]; int solve(int n, vector<int> &a1, vector<int> &a2, vector<int> &a3, vector<int> &m){ dp[0][0] = a1[0];dp[0][1] = a2[0];dp[0][2] = a3[0]; for(int i = 1; i < n; ++i){ dp[i][0] = a1[i] + max(dp[i-1][0], dp[i-1][1]-m[i-1]); dp[i][1] = a2[i] + max(max(dp[i-1][1], dp[i-1][0]-m[i-1]), dp[i-1][2]-m[i-1]); dp[i][2] = a3[i] + max(dp[i-1][2], dp[i-1][1]-m[i-1]); } int ans = max(dp[n-1][0], dp[n-1][1]); ans = max(ans, dp[n-1][2]); return ans; }