【发布时间】:2015-08-18 08:06:10
【问题描述】:
我得到了一个编号为 105 的号码 n。我必须找到多种方法,使用长度为 1 or 2 or 3 or.....or m 的步长从地面到达第 nth 步,此处为 m
由于答案可能太大,因此输出它以 109+7 为模。
#include<iostream.h>
using namespace std;
#define ll long long
#define MOD 1000000007
ll countWays_(ll n, ll m){
ll res[n];
res[0] = 1; res[1] = 1;
for (ll i=2; i<n; i++)
{
res[i] = 0;
for (ll j=1; j<=m && j<=i; j++)
res[i] =(res[i]%MOD+ res[i-j]%MOD)%MOD;
}
return res[n-1];
}
ll countWays(ll s, ll m){
return countWays_(s+1, m);
}
int main (){
scanf("%lld%lld",&s,&m);
printf("%lld\n",countWays(s,m));
return 0;
}
作为O(m*n)的复杂度,我想降低它。
【问题讨论】:
-
不要使用那个标题...stackoverflow.com/q/31816095/1116364
-
thanx @DanielJour!这真的很有帮助!!
-
提示:设 f(n, m) 是 {1..m} 中加到 n 的总和数。写出 f 的递归关系。
-
OP,你熟悉动态规划吗?
-
我正在学习。如果您对此提出建议,我将不胜感激。
标签: c++ algorithm combinations permutation combinatorics