POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂
哈哈,写了好久的,总算对了。
接下来介绍两种思路:
先介绍一种 递推+矩阵的快速幂的方法
一种DP的思想考虑4×n的最后一列 ,可以放的方法一共有5种
1.放4个 1×2 则 为dp[n-2]
2. 放2个 2x1 则为 dp[n-1]
3. 放 1x2 2x1 1x2 则为 dp[n-2]+dp[n-4]+.....+dp[0]
4. 放 1x2 1x2 2x1 为 dp[n-2]+dp[n-3]+dp[n-4]+....+dp[0]
5.和 4 一样 的另外一种情况 所以也是 dp[n-2]+dp[n-3]+....dp[0];
所以最后结果是 dp[n]=dp[n-1]+dp[n-2]+2*(dp[n-2]+dp[n-3]+..dp[0])+dp[n-2]+dp[n-4]+...dp[0];
然后写一个dp[n-2]=.....
减一下,化简 之后的结果是dp[n]=dp[n-1]+5*dp[n-2]+dp[n-3]-dp[n-4]; 这就是递推公式了
之后建立一个矩阵
( 1 5 1 -1
1 0 0 0
0 1 0 0
0 0 1 0 )
dp[0]=1,dp[1]=1,dp[2]=5,dp[3]=11 不断左乘那个矩阵 就可以转化为 那个矩阵的 幂,之后快速幂搞定!!
最后答案注意点,可能为负,那只要 (ans+m)%m 就是正确答案了!。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct matri
{long long f[4][4];
};
long long n,m;
long long dp[5];
matri mul(matri a,matri b)
{int i,j,k;matri c;memset(c.f,0,sizeof(c.f));for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%m;return c;
}
void eps_mul(matri a,int t)
{matri s;memset(s.f,0,sizeof(s.f));s.f[0][0]=s.f[1][1]=s.f[2][2]=s.f[3][3]=1;while(t){if(t&1)s=mul(s,a);a=mul(a,a);t=t>>1;}long long ans=0;for(int i=0;i<4;i++)ans=(ans+dp[i]*s.f[0][3-i]);if((ans%=m)<0) ans=(ans+m)%m;printf("%lld\n",ans);
}
int main()
{dp[0]=1;dp[1]=1;dp[2]=5;dp[3]=11;while(scanf("%lld%lld",&n,&m),n||m){if(n<4) {printf("%lld\n",dp[n]%m);continue;}matri ss;ss.f[0][0]=1;ss.f[0][1]=5;ss.f[0][2]=1;ss.f[0][3]=-1;ss.f[1][0]=1;ss.f[1][1]=0;ss.f[1][2]=0;ss.f[1][3]=0;ss.f[2][0]=0;ss.f[2][1]=1;ss.f[2][2]=0;ss.f[2][3]=0;ss.f[3][0]=0;ss.f[3][1]=0;ss.f[3][2]=1;ss.f[3][3]=0;eps_mul(ss,n-3);}
}
接下来讲第二种状态压缩的方法
很显然会有1<<4中状态
各个状态的匹配就达到了16*16 的矩阵。
矩阵的转移快速幂的意思就是1,2 3,4是同样的。``同理。
状态的转移 很巧妙的就是矩阵的相乘,
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct matrix
{int f[16][16];
};
int n,m;
int pre[16*16],now[16*16];
int top;
void dfs(int num,int p,int q)
{if(num>4)return;if(num==4){pre[top]=q;now[top++]=p;return;}dfs(num+2,(p<<2)|3,(q<<2)|3);dfs(num+1,(p<<1)|1,q<<1);dfs(num+1,p<<1,(q<<1)|1);
}
matrix mul(matrix a,matrix b)
{matrix s;memset(s.f,0,sizeof(s.f));int i,j,k;for(i=0;i<16;i++)for(j=0;j<16;j++)for(k=0;k<16;k++)s.f[i][j]=(s.f[i][j]+a.f[i][k]*b.f[k][j])%m;return s;
}
void quick_pow(matrix A,int k)
{int i;matrix s;memset(s.f,0,sizeof(s.f));for(i=0;i<16;i++)s.f[i][i]=1;while(k){if(k&1)s=mul(s,A);A=mul(A,A);k=k>>1;}printf("%d\n",s.f[15][15]);
}
int main()
{while(scanf("%d%d",&n,&m),n||m){int i;matrix s;memset(s.f,0,sizeof(s.f));top=0;dfs(0,0,0);for(i=0;i<top;i++)s.f[pre[i]][now[i]]=1;quick_pow(s,n);}
}
所以可以写出代码
POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂相关推荐
- Happy Necklace dp 递推 矩阵快速幂
当满足素数2和素数3的条件后,下一个素数区间5乃至之后的都会被满足. 考虑能否从f[n - 1]转换到f[n],考虑第i - 1位,如果后面加红色一定满足条件,所以f[n]先是加上f[n - 1] 如 ...
- 湘潭赛Easy wuxing(递推+矩阵快速幂or DP)
湘潭赛Easy wuxing(递推+矩阵快速幂or DP) 十分感谢老师的思路! 题目描述 "五行"是中国传统哲学思想,它认为认为大自然的现象由"木.火.土.金.水&qu ...
- NYOJ 1075 (递推 + 矩阵快速幂)
"红色病毒"问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 医学研究者最近发现了一种新病毒,因为其蔓延速度与曾经在Internet上传播的&qu ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)
题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- 【递推矩阵快速幂】hdu 2604
前四位我们可以算出d[1]=2,d[2]=4,d[3]=6,d[4]=9. 我们可以这样想:一个合法串可以由两个较短的合法串组成 就以d[n]为例:(注意不能重复) 1.n-1个字符 ...
- HDOJ 2604 Queuing (递推+矩阵快速幂)
点击打开链接 题意:给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个? 解题思路: 首先找出递推关系式,先给出递推关系 ...
- 递推+矩阵快速幂 HDU 2065
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace ...
- POJ 3420 Quad Tiling
矩阵快速幂.先要处理出第i列每个状态下,让该状态填满,下一列可以出现的状态.因为N较大,可以矩阵加速. #pragma comment(linker, "/STACK:1024000000, ...
最新文章
- python urllib.request 爬虫 数据处理-python爬虫1--urllib请求库之request模块
- new和make的区别
- Android的按钮单击事件及监听器的实现方式
- ActiveMQ(为什么要使用消息中间件,JMS传输模型)
- dubbo学习之服务消费者
- [摘自MSDN] ASP.Net2.0学习 [1] 母版页 2 : 创建和使用 ASP.NET 母版页
- table表格for循环绑定数据_.NET MVC 页面表格绘制
- redis 在 mac 下的安装与使用
- Activity singleTop启动模式
- Matlab函数——dct2
- VMware虚拟机XP系统安装
- Matlab中break语句
- 计算机显示屏知识,计算机配置知识之显示屏
- 阿里JAVA实习生面试总结(2019年春招)
- 王阳明心学感悟1——勇敢地剖析自己的内心
- 股市资深大牛用Python写了个股票价格实时MacOS应用程序!实时监控!
- ios上如何能运行android程序,怎么在ios 系统上面运行安卓软件嘛
- 张一鸣宣布卸任字节跳动CEO;贝壳找房创始人左晖因病去世 | 高管变动2021年5月17日-22日...
- 关于HTML表单用户信息进行MD5加密
- MDM经理如何为主要利益相关方加速创造价值 - 第一部分:消除重复的客户信息