luogu P1192 [problem] steps

This is a dynamic programming problem, dynamic transfer equation is:

 

 

 $$ans=\sum^{k}_{j=1}{f_{(i-j)}} (f_{0}=1)$$

 

 

 ***

 

 - Memory search

 `` `Cpp

#include<iostream>

#include<cstdio>

using namespace std;

#define MAX 100005

#define mod 100003

int n,k;

int bin[MAX];

int f(int i){

if (i == 0) return 1; // I 0 when 0 is returned directly

if (bin [i]) return bin [i]% mod; // if previously pushed through f (i), and call it directly bin [i]

for (int j = 1; j <= k && ij> = 0; ++ j) bin [i] = (bin [i]% mod + f (ij)% mod)% mod; // can not be pushed through do it again

return bin[i]%mod;

}

int main () {

scanf("%d%d",&n,&k);

printf ( "% d \ n", f (n)% mod); // finally have to look%

return 0;

}

```

290ms, 7200KB

 - an array of recursive

`` `Cpp

#include<iostream>

#include<cstdio>

using namespace std;

#define MAX 100005

#define mod 100003

int n,k;

int f[MAX];

int main () {

scanf("%d%d",&n,&k);

f[0]=1;

for(int i=1;i<=n;++i)

for(int j=1;j<=k&&i-j>=0;++j)

f[i]=(f[i]%mod+f[i-j]%mod)%mod;

printf("%d\n",f[n]%mod);

return 0;

}

```

220ms, 944KB

 

~ ~ ~ ~ Fast or array

 

The time complexity of O (nk)

 

 

 



 $$ans=\sum^{k}_{j=1}{f_{(i-j)}} (f_{0}=f_{1}=1)$$   ***  - 记忆化搜索 ```cpp#include<iostream>#include<cstdio>using namespace std;#define MAX 100005#define mod 100003int n,k;int bin[MAX];int f(int x){if(x==1||x==0)return 1;if(bin[x])return bin[x]%mod;for(int i=1;i<=k&&x-i>=0;++i)bin[x]=(bin[x]%mod+f(x-i)%mod)%mod;return bin[x]%mod;}int main(){scanf("%d%d",&n,&k);printf("%d\n",f(n)%mod);return 0;}``` - 数组递推 

 

Guess you like

Origin www.cnblogs.com/Lates/p/11129234.html