试图解决动态编程问题

时间:2015-06-19 05:48:14

标签: c++ dynamic-programming

我在比赛已经结束时遇到了问题。以下是问题。

在Poornima学院,PIET CS Deparment正从地下室转移到三楼。该部门的HOD正在努力寻找到达三楼的方式。你得到楼梯的数量,你必须帮助HOD找出他可以爬楼梯的方式。 HOD能够一次最多爬两个楼梯,最小零。

Input:The first line contains the number of test cases, T. 
T lines follow, each of which contains total number of stairs.

Output:
Print the total number of possible ways to climbing the stairs.

Constraints: 
1<=T<=100
1<=N<=100

Sample Input(Plaintext Link)
 3
1
2
4
Sample Output(Plaintext Link)
 1
2
5
Explanation
Input: n = 1
Output: 1
There is only one way to climb 1 stair

Input: n = 2
Output: 2
There are two ways: (1, 1) and (2,0)

Input: n = 4
Output: 5
(1, 1, 1, 1), (1, 1, 2,0), (2, 1, 1,0), (1, 2, 1,0), (2, 2,0,0) are the only four ways to climb stairs.

我确信使用DP可以实现解决方案。但是我试过并且失败了我是解决DP问题的新手。我能解决它吗?

这是一个解决方案,但DP公式是如何得出的?

#include<cstdio>
#include<iostream>
#include<vector>
#include<utility>
#include<string.h>
#include<algorithm>
#include<cmath>

#define LL long long int
#define s(a) scanf("%d",&a)

#define ss(a) scanf("%s",a)
#define w(t) while(t--)
#define f(i,n) for(i=0;i<n;i++)
#define fd(i,n) for(i=n-1;i>=0;i--)
#define p(a) printf("%d",a)

#define ps(a) printf("%s",a)
#define pc(a) printf("%c",a)
#define ent printf("\n")
bool wayToSort(int i, int j) { return i > j; }
using namespace std;
long long int dp[1005];
int main()
{   dp[0]=0;
    dp[1]=1;
    dp[2]=2;
    int t,i,j,n;
    for(i=3;i<=1000;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    s(t);
    w(t)
    {
        s(n);
        cout<<dp[n]<<endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

嗯,这是一个非常通用的动态编程难题...假设你在第n个楼梯,那么你可以到第n个楼梯的方式的数量是到达第n-1楼梯的方式的数量在楼梯上! 为什么? 好吧,我可以通过n-1阶梯爬上一个楼梯,从n-2阶梯直接攀爬两个,到达第n个楼梯!

Morover我觉得你的问题陈述有问题,它说我们至少可以移动0步,这将导致达到一些阶梯无限的方式!为什么?我可以简单地使用无限的步骤来保持在同一个楼梯上然后移动到下一个楼梯!所以我假设你可以一次移动一两个楼梯