[题解]P8784 [蓝桥杯 2022 省 B] 积木画
思路
Part 1#
考虑 DP。
令 表示 为 时的答案。
则有 。
因为,我们想一想,如果我们的最后一个放的 I
形方块,那么可以放在最前面和最后面,因此我们还需要加上 。
其次,如果还剩 的位置,在满足情况的前提下,那一部分无论如何都是一样的,所以只需加上 即可。
我们再来观察数据范围可知,如果直接开数组 是不行的,所以,我们考虑优化。
Part 2#
我们可以用四个变量 分别表示 ,在 DP 过程中,直接对这 个变量转移即可。
Code
#include <bits/stdc++.h>
#define int long long
#define re register
using namespace std;
const int mod = 1e9 + 7;
int n,a = 1,b = 1,c = 2,d;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
signed main(){
n = read();
if (n == 1) puts("1");//特判前两位
else if (n == 2) puts("2");
else{
for (re int i = 3;i <= n;i++){
d = ((c << 1) + a) % mod;//记得取模
a = b;
b = c;
c = d;
a %= mod;
b %= mod;
c %= mod;
d %= mod;
}
printf("%lld\n",d);//输出
}
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18268807
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】