@TOC
填矩阵
时间限制:1秒
空间限制:128M
题目描述
有一个的矩阵,现在往里面填方块,一共有三种方块:的白块,的黑块,的黑块,方块放置时,必须是黑白交替的,矩阵不用填满,但要求最下面的块和最上面的块必须是黑色的,问有多少种放置方法。
输入描述
输入两个整数代表矩阵的高度和黑块的高度
数据范围
输出描述
输出一个整数代表放置方法
样例一
输入
输出
题目大意
为了便于理解题意,我画了一张图来解释:
示例
题目分析
用两个数组:
1 2
| int Bai[111] = {0}; int Hei[111] = {0};
CPP
|
初始值:
1 2
| Hei[1] = 1; Bai[0] = 1;
CPP
|
之后,从第二块儿开始模拟:
- 如果第块是1x1的白块,那么下面一块必定是黑块。
- 如果第块是1x1的黑块,那么下面一块必定是白块。
- 如果第块是1xk的黑块(前提是i≥k),那么下面一块(i - k)必定是白块
1 2 3
| if (i - k >= 0) { Hei[i] += Bai[i - k]; }
CPP
|
最后再把所有的最上面是黑块的情况累加起来即可。
1 2 3 4 5
| ll ans = 0; for (int i = 1; i <= n; i++) { ans += Hei[i]; } cout << ans << endl;
CPP
|
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <bits/stdc++.h> using namespace std; #define mem(a) memset(a, 0, sizeof(a)) #define dbg(x) cout << #x << " = " << x << endl #define fi(i, l, r) for (int i = l; i < r; i++) #define cd(a) scanf("%d", &a) typedef long long ll;
ll n, k; ll Bai[111] = {0}; ll Hei[111] = {0};
int main() { Hei[1] = 1, Bai[0] = 1; cin >> n >> k; for (int i = 2; i <= n; i++) { Bai[i] = Hei[i - 1]; Hei[i] = Bai[i - 1]; if (i - k >= 0) { Hei[i] += Bai[i - k]; } } ll ans = 0; for (int i = 1; i <= n; i++) { ans += Hei[i]; } cout << ans << endl; return 0; }
CPP
|
虽然代码可以复制,但最好还是自己理解后再敲哦
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125918304