变相
最优解法
可以发现,每一列能拿到的最多金币数取决于他上一列拿了多少金币。考虑动态规划
用代表位于第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;
}
查看7道真题和解析