蓝桥-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;
}
posted @ 2022-12-26 09:53  YaosGHC  阅读(59)  评论(0)    收藏  举报