给定一个正整数int n,从0开始加到n,每次可增加1、2或3,直到其大于等于n,请返回一个数,代表加到n的方案的个数。保证n小于等于100000,并为了防止溢出,请将结果Mod 1000000007。
测试样例1:
1
返回:1
测试样例2:
3
返回:4
测试样例3:
4
返回:7
//只需要额外申请三个空间存放a,b,c,减小了空间复杂度 class GoUpstairs { public: int countWays(int n) { // write code here int a=1; int b=2; int c=4; if(n<1) return 0; if(n==1) return a; if(n==2) return b; if(n==3) return c; for(int i=4;i<=n;i++){ int temp=((a+b)%1000000007+c)%1000000007; a=b;b=c;c=temp; } return c; } };
//对于上k级台阶,当k>3时,由于每次可以上1,2,3级,则最后一次应该是上1,2,3中的一个 //case1,最后一次上1级,也即前面上了k-1级,k-1级的可能情况为:A[k-1]次 //同理 case2,A[k-1], case3 A[k-3] //从而有: A[k] = A[k-3] + A[k-2] + A[k-1] class GoUpstairs { public: int countWays(int n) { long long resMid; long long frontWay[3] = { 1, 2, 4 }; if (n < 4) return frontWay[n - 1]; for (int i = 3; i < n; i++){ long long temp = frontWay[0] + frontWay[1] + frontWay[2]; frontWay[0] = frontWay[1]; frontWay[1] = frontWay[2]; frontWay[2] = temp; if (frontWay[2] > 1000000007){ frontWay[2] = frontWay[2] % 1000000007; } } int res = frontWay[2] % 1000000007; return res; } };
import java.util.*; public class GoUpstairs { public int countWays(int n) { // write code here long[] pre = {1, 2, 4}; if(n<=0) return 0; else if(n<=3) return (int)pre[n-1]; else{ for(int i=4; i<=n; i++){ long tmp = ((pre[0] + pre[1])%1000000007 +pre[2])%1000000007; pre[0] = pre[1]; pre[1] = pre[2]; pre[2] = tmp; } } return (int)pre[2]; } }
class GoUpstairs { public: int countWays(int n) { // write code here int f1=1; int f2=2; int f3=4; int result=0; if(n<=0) return 0; if(n==1) return 1; if(n==2) return 2; if(n==3) return 4; for(int i=4;i<=n;i++) { result=((f3+f2)%1000000007+f1)%1000000007; f1=f2; f2=f3; f3=result; } return result; } };
class GoUpstairs { public: int countWays(int n) { // write code here int *N=(int *)malloc(sizeof(int)*n); memset(N,0, sizeof(N)); N[0]=1;N[1]=2;N[2]=4; for(int i=3;i<n;i++){ N[i]=(((N[i-3]+N[i-2])%1000000007)+N[i-1])%1000000007; } return N[n-1]; } };
class GoUpstairs { public: int countWays(int n) { // write code here int a[]={0,1,2,4}; int f; if(n<4) return a[n]; for(int i=4;i<=n;i++) { f=((a[1]+a[2])%1000000007+a[3])%1000000007; a[1]=a[2]; a[2]=a[3]; a[3]=f; } return a[3]; } };数学规律f(i)=f(i-1)+f(i-2)+f(i-3)。f(i-1)+f(i-2)+f(i-3)每两个相加都有可能大于100000007,所以在每次相加后取模。
class GoUpstairs { public: int countWays(int n) { // write code here int dp[4], res; dp[1] = 1, dp[2] = 2, dp[3] = 4; if(n <= 3) res = dp[n]; for (int j = 4; j <= n ; ++j) { res = ((dp[1] + dp[2]) % 1000000007 + dp[3]) % 1000000007; dp[1] = dp[2]; dp[2] = dp[3]; dp[3] = res; } return res; } };
//不另外开辟数组空间,定义几个变量依次移动
public int countWays(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
int mod = 1000000007;
int first = 1;
int second = 2;
int third = 4;
int result = 0;
for (int i = 4; i <= n; i++) {
result = (first + second) % mod + third % mod;
first = second % mod;//依次往后移动一位数
second = third % mod;
third = result;
}
return result % mod;
}
//Fibonacci sequence f(n) = f(n-1)+f(n-2)+f(n-3); And f(1)=1,f(2)=2,f(3)=4 import java.util.*; public class GoUpstairs { public int countWays(int n) { int[] arr = {1, 2, 4}; if(n <= 0){ return 0; } else if(n <= 3){ return arr[n-1]; } else { for(int i = 4; i <= n; i++){ int tmp = ((arr[0] + arr[1]) % 1000000007 + arr[2]) % 1000000007; arr[0] = arr[1]; arr[1] = arr[2]; arr[2] = tmp; } } return arr[2]; } }
/* 模运算有一个特点就是 (a + b) % c 相当于 ((a %c + b%c) % c) 另外注意到每次当前状态 i 只与前三个状态有关,因此可以只申请3个空间的数组,每次状态i模3 就可以了。 */ public int countWays(int n) { // write code here if (n <= 0) { return 0; } long[] res = new long[3]; res[0] = 1; res[1] = 2; res[2] = 4; int mod = 1000000007; for (int i = 3; i < n; ++i) { res[i % 3] = (res[(i - 1) % 3] + res[(i - 2) % 3] + res[(i - 3) % 3]) % mod; } return (int)res[(n - 1) % 3]; }
package 上楼梯;
public class GoUpstairs {
private static final int MOD = 1000000007;
public int countWays(int n) {
// write code here
if (n == 1)
return 1;
if (n == 2)
return 2;
if (n == 3)
return 4;
// 利用三元一次方程组手算的base
int[][] base = { { 1, 1, 0 }, { 1, 0, 1 }, { 1, 0, 0 } };
int[][] res = new int[base.length][base[0].length];
for (int i = 0; i < res.length && i < res[0].length; i++) {
res[i][i] = 1;
}
res = matrixPower(base, n - 3, res);
//return (4 * res[0][0] + 2 * res[1][0] + res[2][0]) % MOD;
int[][] a = {{4,2,1}};
res = multiMatrix(a, res);
return res[0][0];
}
private int[][] matrixPower(int[][] base, int n, int[][] res) {
if (0 == n) {
return res;
} else {
if ((1 & n) == 0) { // 如果n是偶数
return matrixPower(multiMatrix(base, base), n / 2, res);
} else {
return matrixPower(base, n - 1, multiMatrix(res, base));
}
}
}
private int[][] multiMatrix(int[][] m1, int[][] m2) {
int[][] res = new int[m1.length][m2[0].length];
int m1_row = m1.length;
int m1_col = m1[0].length;
int m2_col = m2[0].length;
for (int i = 0; i < m1_row; i++) {
for (int j = 0; j < m2_col; j++) {
for (int k = 0; k < m1_col; k++) {
long tmp = ((long)(m1[i][k] % MOD) * (long)(m2[k][j]%MOD));
long tmp2 = (tmp % (long)MOD);
int tmp3 = (int)tmp2;
res[i][j] = (tmp3 + res[i][j]) % MOD;
}
}
}
return res;
}
public static void main(String[] args) {
GoUpstairs go = new GoUpstairs();
System.out.println(go.countWays(36196));
}
}
import java.util.*; public class GoUpstairs { public int countWays(int n) { if (n <= 0) return 0; if (n <= 3) return 1 << (n-1); int[] f = {1, 2, 4}; int result = 0; for (int i = 4; i <= n; i++) { result = (((f[0] + f[1]) % 1000000007) + f[2]) % 1000000007; f[0] = f[1]; f[1] = f[2]; f[2] = result; } return result; } }