第四十四题 前面的跳台阶动态规划的加深 可能跳不定的台阶 需要维护一个sum
class Solution {
public:
int jumpFloorII(int number) {
// 相比正常跳 每次多一种直接跳出去
// 假如说 number是4 那么 结果就等于3的全部可能性(4跳了一步到3)+2的全部可能性(4跳到2)+1的全部可能性(4跳到1)+1(4直接跳出去)
// 而前面每次321的全部可能都是数组求和,所以可以弄一个sum 一直用来累加
int *a = new int[number];
if(number==1) return 1;
if(number==2) return 2;
a[0]=1;
int sum=1;
// 可以只用sum 循环 最后返回sum
// 这里放到数组里 只是为了解释清楚 到底前面每一项是怎么出来的
for(int i =1;i<number;i++)
{
a[i]=sum+1;
sum+=a[i];
}
// for(int i =0;i<number;i++)
// {
// cout<<a[i]<<endl;
// }
// 这边输出了结果发现,答案是2^(number-1) 思考一下为啥
// return pow(2,number-1);
// 提示:
// 假设是3 = 1+2+1 =4 sum=1+2+4=7
// 假设是4 = 1+2+4+1=8 sum=1+2+4+8=15
// 假设是5 = 1+2+4+8+1=16 sum+1+2+4+8+16=31
// 所以ans=sum+1 而sum=sum+ans=2*sum+1 每次翻一倍+1 再到下一次输出ans再+1,正好就成了每次翻倍
return a[number-1];
}
};
public:
int jumpFloorII(int number) {
// 相比正常跳 每次多一种直接跳出去
// 假如说 number是4 那么 结果就等于3的全部可能性(4跳了一步到3)+2的全部可能性(4跳到2)+1的全部可能性(4跳到1)+1(4直接跳出去)
// 而前面每次321的全部可能都是数组求和,所以可以弄一个sum 一直用来累加
int *a = new int[number];
if(number==1) return 1;
if(number==2) return 2;
a[0]=1;
int sum=1;
// 可以只用sum 循环 最后返回sum
// 这里放到数组里 只是为了解释清楚 到底前面每一项是怎么出来的
for(int i =1;i<number;i++)
{
a[i]=sum+1;
sum+=a[i];
}
// for(int i =0;i<number;i++)
// {
// cout<<a[i]<<endl;
// }
// 这边输出了结果发现,答案是2^(number-1) 思考一下为啥
// return pow(2,number-1);
// 提示:
// 假设是3 = 1+2+1 =4 sum=1+2+4=7
// 假设是4 = 1+2+4+1=8 sum=1+2+4+8=15
// 假设是5 = 1+2+4+8+1=16 sum+1+2+4+8+16=31
// 所以ans=sum+1 而sum=sum+ans=2*sum+1 每次翻一倍+1 再到下一次输出ans再+1,正好就成了每次翻倍
return a[number-1];
}
};