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]);
}
}