蓝桥-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步