首页 > 其他 > 详细

luogu P1192【台阶问题】

时间:2019-07-03 23:23:33      阅读:179      评论:0      收藏:0      [点我收藏+]

题目https://www.luogu.org/problemnew/show/P1192

这是一道动态规划题,动态转移方程为 :

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


 

  •  记忆化搜索

 

#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时返回1
	if(bin[i])return bin[i]%mod;//如果在做这个的时候f(i)已经被推出来了,就直接调用bin[i]
	for(int j=1;j<=k&&i-j>=0;++j)bin[i]=(bin[i]%mod+f(i-j)%mod)%mod;//没有就做一遍
	return bin[i]%mod;
}
int main(){
	scanf("%d%d",&n,&k);
	printf("%d\n",f(n)%mod);//注意最后也要%一下
	return 0;
}

290ms, 7200KB

  •   数组递推

 

#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;
	if(bin[i])return bin[i]%mod;
	for(int j=1;j<=k&&i-j>=0;++j)bin[i]=(bin[i]%mod+f(i-j)%mod)%mod;
	return bin[i]%mod;
}
int main(){
	scanf("%d%d",&n,&k);
	printf("%d\n",f(n)%mod);
	return 0;
}

220ms, 944KB

还是数组快

时间复杂度 O(nk)

 

luogu P1192【台阶问题】

原文:https://www.cnblogs.com/Lates/p/11129234.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!