滚动数组是动态规划中的一种思想,用固定的几个空间去迭代寻找解,以起到压缩空间的效果。
当然,他也因此牺牲了时间上的效率。
一维的滚动数组,说白了DP题目是一个自底向上的扩展过程,我们只需要的是最终的结果的话,对过程的连续的解不需要的话,滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。 是 也是优化版本的斐波那数列的操作。
比如说在这我们就可以拿斐波那数列来举例子,这里我们只需要开辟 dp[0] 、 dp[1]、dp[2]三个空间,用来循环:dp[0]是暂存的空间,而在此就把 0 + 1 = 1 赋值给了 第三个 dp[2] 也就是 表格中第二行第一列的 1 ( DP[0] )。而后 DP【1】 = 1 + 1 = 2 ................以此不断循环而来
模板如下:
for(i=2;i<xx;i++)//xx为具体情境下的参数
{
dp[0]= dp[1];
dp[1]= dp[2];
dp[2]= dp[0] + dp[1];
}
扩展到二维:
如上图:
3 = 第二行第二列的 2 + 第一列的第二行 的 1
(其他可以自己推)
也就是 : DP[i][ j ] = DP [i-1][ j ] +DP [ i] [ j-1 ]
类似于此模板:
int i, j, d[100][100];
for(i = 1; i < 100; i++)
for(j = 0; j < 100; j++)
d[i][j] = d[i - 1][j] + d[i][j - 1];
6034.数组的三角之和
题目分析:此可以用一维滚数组的思想,直接模拟操作就行
int triangularSum(int* nums, int n){
int i;
while(n != 1) {
for(i = 0; i < n - 1; ++i) {
nums[i] = (nums[i] + nums[i+1] ) % 10;
}
--n;
}
return nums[0];
}