HDU 2041 超级楼梯

Posted jpphy0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2041 超级楼梯相关的知识,希望对你有一定的参考价值。

链接

超级楼梯 - http://acm.hdu.edu.cn/showproblem.php?pid=2041

分析

  • 完整的递推关系

在这里插入图片描述

  • 局部关系图:(循环节 -> 递推节)此图中,
    • n-2的 “出” 是完整的
    • n的 “入” 是完整的
    • n-1的“出”与“入”都是不完整的
    • 但三者的关系是完整的
1
1
1
n-2
n-1
n

F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(n) = F(n-1) + F(n-2) F(n)=F(n1)+F(n2)

F n = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F_n =\\frac{1}{\\sqrt{5}} \\left[\\left(\\frac{1+\\sqrt{5}}{2}\\right)^n-\\left(\\frac{1-\\sqrt{5}}{2}\\right)^n\\right] Fn=5 1[(21+5 )n(215 )n]

递推的关键

  • 在计算 F(n) 时,要保证F(n-1)、F(n-2)、F(n-3)、……、F(2)、F(1) 已全部完成计算
  • 计算的次序是F(1)、F(2)、F(3)、……、F(n-2)、F(n-1)、F(n)
  • 站在n的位置上有两种思维方式:
    • 上一步在哪里?从哪里来?
    • 下一步去哪里?到哪里去?
    • 递推更多的是考虑:上一步在哪里?从哪里来?

代码

从哪里来?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans[50];
int t; 
int main(){
	ans[1]=ans[2]=1;
	for(int i=3;i<=40;i++){ // i = 3, 4, 5, 6,……, 40
		ans[i]=ans[i-1]+ans[i-2]; // 当前在位置:i,从哪里来?
	 } 
	scanf("%d",&t);
	while(t--){
		int a;
		scanf("%d",&a);
		printf("%lld\\n",ans[a]);
	}
	return 0;
 } 

到哪里去?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans[50];
int t; 
int main(){	
    memset(ans, 0, sizeof ans);
    ans[1]=1;
	for(int i=1;i<=40;i++){ // i = 3, 4, 5, 6,……, 40
        // 到哪里去?
        ans[i+1] += ans[i];
        ans[i+2] += ans[i];
	 } 
	scanf("%d",&t);
	while(t--){
		int a;
		scanf("%d",&a);
		printf("%lld\\n",ans[a]);
	}
	return 0;
 }

以上是关于HDU 2041 超级楼梯的主要内容,如果未能解决你的问题,请参考以下文章

Hdu2041 超级楼梯 (斐波那契数列)

hdu 2041 超级楼梯(简单dp)

hdu 2041 超级楼梯

HDU 2041 超级楼梯 简单动态规划

hdu2041超级楼梯(DP)

HDU - 超级楼梯