又见台阶
最优解
考虑动态规划
用表示牛牛到第
层的方案数,则
等于所有
的和,
满足:
因此可以使用f数组的奇数项的前缀和和偶数项的前缀和进行转移。
因为f数组中需要的只是的值,所以f值可以在计算的过程中只用临时变量存储。实际存储的值是
和
,其中
表示所有i为偶数的
的和,
表示所有i为奇数的
的和,那么
实际上就等于
。
对于积水的台阶,因为保证a是以升序给出,所以用一个指针维护下一个积水的台阶就可以不使用额外空间去记录积水台阶了。
空间复杂度,时间复杂度
int solve(int n, int m, vector<int>& a) {
int mod = 1e9 + 7;
int dp[2] = {1, 0};
int p = 0;
for(int i = 1; i <= n; ++i){
if(p < m && a[p] == i) {p++; continue; }
if(i == n) return dp[(i-1)%2];
dp[i%2] = (dp[i%2] + dp[(i-1)%2])%mod;
}return 0;
}

上海得物信息集团有限公司公司福利 1166人发布
查看11道真题和解析