SP3883 题解
题目传送门
和其他两篇题解的 dp 思路稍许不同,因为有两维且是状压。
正常来说一维可能是不够的,因为有可能枚举到一列时后面一行用
设状态
那么还差一个转移方程。
#include <iostream>
using namespace std;
int dp[35][8],n;
int main()
{
dp[0][0] = 1;//初始第0行没有尾巴,值为1
for(int i = 1;i <= 30;i ++)
for(int j = 0;j < 8;j ++)
for(int k = 0;k < 8;k ++)
if(!(j & k) && !((7 - j - k) % 3))dp[i][j] += dp[i - 1][k];//7-j-k:中间没有被占用的格子的二进制状态
while(cin >> n && n != -1)cout << dp[n][0] << '\n';//输出答案显然不能留尾巴
}
这题的数据范围只有
#include <iostream>
using namespace std;
int dp[35] = {1,0,3,0,11,0,41,0,153,0,571,0,2131,0,7953,0,29681,0,110771,0,413403,0,1542841,0,5757961,0,21489003,0,80198051,0,299303201},n;
int main()
{
while(cin >> n && n != -1)cout << dp[n] << '\n';
}