蓝桥-13届-C++-B组-省赛-G题-积木画

直达链接

当时第一眼看到觉得题型挺眼前一亮的,但是怎么做,没想法,也不明白考点在哪里

画布高度固定是2,但是积木可以任意旋转,可以说L型只能和自己组合

怎么用编程解决空间问题?

参考这篇博文
得到的递推方程为:f(i) = 2f(i-1)+f(i-3)
那么需要考虑的就是3以前元素的初始化的问题

代码如下:

#include<iostream>
#include<vector>
using namespace std;
const int mod = 1e9 + 7;
int main() {
int n;
cin >> n;
vector<int> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
dp[3] = 5;
for (int i = 4; i <= n; i++)
dp[i] =( 2 * dp[i - 1]%mod + dp[i - 3]%mod)%mod;
printf("%d", dp[n]);
return 0;
}

这里的一维dp数组应该是可以空间优化为常数个变量的
需要注意的是这里取模的运算律,需要在最外面再模一次,平常不这么干所以不是很了解

另外提到的这里是洛谷的原题P1990-覆盖墙壁
代码改一改能过,只是要求取最后四位也是我没见过的,这边看他们的操作是%10000

#include<iostream>
#include<vector>
#include<string>
using namespace std;
const int mod = 10000;
int main() {
int n;
cin >> n;
vector<long long> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
dp[3] = 5;
for (int i = 4; i <= n; i++)
dp[i] = (2 * dp[i - 1] % mod + dp[i - 3] % mod) % mod;
string str = to_string(dp[n]);
if (str.size() > 4)
for (int i = str.size() - 4; i < str.size(); i++)
cout << str[i];
else cout << str;
return 0;
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/17003019.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(52)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起