走楼梯2(Daimayuan Online Judge)

简介: 走楼梯2(Daimayuan Online Judge)

这题我的解法是使用状态机思维且看我下面的状态关系图:

这是我给出的三个状态,走一步用0状态表示,走一次两步用1状态表示,走两次两步用状态2表示,他们的转移关系如图

对图的解释:
1.走一步怎么转移过来的:可以选择继续走一步转移过来(如图中的自环);走两步无论第一次还是第二次走两步,可以下一次走一步。

2.走一次两步怎么转移过来的: 可以走一步后选择走两步。
3.连续走两次两步怎么转移过来的: 可以走一次两步后再接着走两步。

1.状态定义

定义f [ i , j ] f[i,j]f[i,j],i ii 为此时是第几个台阶,j jj为此时的状态是走一步转移过来的(0),还是连续两次走两步过来的(2),还是只走一次两步过来的(1),此时的方案数为f [ i ] [ 0 ] + f [ i ] [ 1 ] + f [ i ] [ 2 ] f[i][0]+f[i][1]+f[i][2]f[i][0]+f[i][1]+f[i][2]

2.状态表示

根据状态图可以得出下面的转移式

1.f [ i ] [ 0 ] + = f [ i − 1 ] [ 0 ] + f [ i − 1 ] [ 2 ] + f [ i − 1 ] [ 1 ] ; f[i][0]+=f[i-1][0]+f[i-1][2]+f[i-1][1];f[i][0]+=f[i1][0]+f[i1][2]+f[i1][1];

2.f [ i ] [ 1 ] + = f [ i − 2 ] [ 0 ] ; f[i][1]+=f[i-2][0];f[i][1]+=f[i2][0];

3.f [ i ] [ 2 ] + = f [ i − 2 ] [ 1 ] ; f[i][2]+=f[i-2][1];f[i][2]+=f[i2][1];

/*********************************************************************
    程序名:
    版权: Joecai
    作者: Joecai
    日期: 2022-03-27 21:17
    说明:
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
# define rep(i,be,en) for(int i=be;i<=en;i++)
# define pre(i,be,en) for(int i=be;i>=en;i--)
typedef pair<int, int> PII;
#define ll long long
#define endl "\n"
#define LOCAL
#define pb push_back
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
int n;
ll f[100][3];
void solve()
{
  cin >> n;
  f[0][0] = 1;
  f[1][0] = 1;
  for (int i = 2; i <= n; i++)
  {
    f[i][0] += f[i - 1][0] + f[i - 1][2] + f[i - 1][1];
    f[i][1] += f[i - 2][0];
    f[i][2] += + f[i - 2][1];
  }
  cout << f[n][0] + f[n][1] + f[n][2] << endl;
}
int main() {
  //std::ios::sync_with_stdio(false);
  //std::cin.tie(nullptr);
  //#ifdef LOCAL
  //freopen("data.in.txt","r",stdin);
  //freopen("data.out.txt","w",stdout);
  //#endif
  int __ = 1;
  //cin>>__;
  while (__--)
  {
    solve();
  }
  return 0;
}

点个赞走吧~

目录
相关文章
|
机器学习/深度学习 人工智能 算法
迷宫老鼠问题(Maze Mouse Problem
迷宫老鼠问题(Maze Mouse Problem)是一个经典的计算机算法问题,用于测试算法在解决寻路问题方面的性能。这个问题可以应用于人工智能、机器学习和导航算法等领域。
96 6
|
Java
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
47 0
light oj 1231-1232 - 1233- Coin Change 背包
暂时到半懂不懂也没办法讲明白,就不误人子弟了,直接贴代码了。
35 0
|
C++
【PAT甲级 - C++题解】1038 Recover the Smallest Number
【PAT甲级 - C++题解】1038 Recover the Smallest Number
70 1
|
机器学习/深度学习 Windows
The 2022 ICPC Asia Regionals Online Contest (I)-D题题解(DFS暴搜+剪枝+打表去重+二分)
时间复杂度:O(227 + nlog(n) + T * log(n)),227是DFS打表的时间,nlog(n)是vertor排序的时间,T*log(n)是询问次数和二分搜答案的时间。(如果算错了,评论或者私信指出谢谢)
168 0
The 2022 ICPC Asia Regionals Online Contest (I)-D题题解(DFS暴搜+剪枝+打表去重+二分)
|
算法
HDU-1050,Moving Tables(不用贪心也AC)
HDU-1050,Moving Tables(不用贪心也AC)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
|
移动开发
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
洛谷P2639-[USACO09OCT]Bessie‘s Weight Problem G(01背包)
|
Java Linux C++
浅谈online judge平台 spj [special judge] 使用 | 修改问题(上)
浅谈oj平台 spj 使用 | 修改问题 首先: 参数对应 返回值 代码提交 几种spj 第一种:简单的一类特判 第二种:多组输入的特判 第三种:需要判断特殊情况[impossible] 第四种:带有[testlib.h]的spj 第五种:GCPC [German Collegiate Programming Contest] 类spj
578 0
浅谈online judge平台 spj [special judge] 使用 | 修改问题(上)
浅谈online judge平台 spj [special judge] 使用 | 修改问题(下)
第六种:交互题的spj 第七种[带有testlib.h]的另一种解决方式 第八种 使用validation.h的BAPC2018(较难)
548 0