码迷,mamicode.com
首页 > 其他好文 > 详细

ECNU 3531 定西

时间:2021-01-22 12:14:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:节奏   void   https   input   方向   遇见   tin   总数   状态转移方程   

ECNU 3531 定西

链接

https://acm.ecnu.edu.cn/problem/3531

题目

单点时限: 1.0 sec

内存限制: 256 MB

这么多年你一个人一直在走
方向和天气的节奏会让你忧愁
你说你遇见了一大堆奇怪的人
他们看上去好像都比你开心
——李志《定西》

这首歌的吉他节奏总感觉是在致敬《加州旅馆》,前奏又像葫芦娃里面在蛇精洞是的配乐

一个人走走了很多年,发现自己走到了一个很长的,年久失修的楼梯面前。年久失修的意思就是,有 个台阶坏了,没法走。

楼梯一共有 n 层,你一次能上一阶、两阶或三阶台阶,请问,你从楼梯底部 (0 开始) 走到楼梯顶部,共有多少种走法。

输入格式
输入数据共两行,第一行包含两个自然数 n () 和 k (),第二行包含 k 个自然数 (),数字之间用一个空格隔开,表示损坏的台阶的序号(从楼梯底部到楼梯顶部,台阶序号依次为 1 到 n)。

输出格式
输出数据仅包含一个整数,表示所有可行走法的总数。

样例
input
5 2
2 4
output
2

思路

常见的dp问题,并不算难,就是需要考虑到特殊情况。
首先特判一下,如果第n层坏了,直接输出0,到不了、
之后若n<=3,分别判断,在上面我已经把不可能到的当做0,所以可以直接加法。
之后就是状态转移方程,a[i + 1] = a[i] + a[i - 1] + a[i - 2]考虑一下边界值即可。

代码

public static void fun() {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] a = new int[n + 1];
    int k = sc.nextInt();
    for (int i = 0; i <= n; i++) {
      a[i] = 1;
    }
    for (int i = 0; i < k; i++) {
      int temp = sc.nextInt();
      a[temp] = 0;
    }
    if (a[n] == 0) {
      System.out.print(0);
    } else if (n <= 3) {
      int sum = 0;
      if (n == 1) {
        sum = a[1];
      } else if (n == 2) {
        sum = a[1] + a[2];
      } else {
        sum = a[1] + a[1] + a[2] + a[3];
      }
      System.out.print(sum);
    } else {
      if (a[1] != 0) {
        a[1] = 1;
      }
      if (a[2] != 0) {
        a[2] = a[1] + 1;
      }
      if (a[3] != 0) {
        a[3] = a[2] + a[1] + 1;
      }
      for (int i = 3; i < n; i++) {
        if (a[i + 1] != 0) {
          a[i + 1] = a[i] + a[i - 1] + a[i - 2];
        }
      }
      System.out.print(a[n]);
    }
  }

ECNU 3531 定西

标签:节奏   void   https   input   方向   遇见   tin   总数   状态转移方程   

原文地址:https://www.cnblogs.com/blogxjc/p/14310471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!