矩阵乘法(摆花)

摆花
【问题描述】
艺术馆门前将摆出许多花,一共有 n 个位置排成一排,每个位置可以摆花也
可以不摆花。有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不
好看了。假定每种花数量无限,求摆花的方案数。
【输入】输入文件名为(flowers.in)
输入有 1+m 行,第一行有两个用空格隔开的正整数 n、 m, m 表示花的种类数。接
下来的 m 行,每行有 m 个字符 1 或 0, 若第 i 行第 j 列为 1,则表示第 i 种花和第
j 种花不能排在相邻的位置,输入保证对称。(提示:同一种花可能不能排在相
邻位置)。
【输出】输出文件名为(flowers.out)
输出只有一个整数,为方案数(这个数字可能很大,请输出方案数除以
1000000007 的余数)。
flowers.in flowers.out
2 2
01
10
7
样例解释
七种方案为(空,空) 、(空, 1)、( 1、空)、( 2、空)、(空、 2)、( 1,1)、( 2,2)
数据范围与约定
对于 20%的数据, 1<n≤5,0<m≤10。
对于 60%的数据, 1<n≤200,0<m≤100。
对于 100%的数据, 1<n≤1000000000, 0<m≤100。


很容易知道dp公式为f[i][j]+=f[i-1][k](map[k][j]==0)

由于n很大,这时就用到矩阵乘法。

f[i][0]  f[i-1][0] 1 1 1

f[i][1] = f[i-1][1]*1 1 0

f[i][2]  f[i-1][2] 1 0 1

可以发现,乘上的这个矩阵就是输入的矩阵,任何不摆花可以和所有花相邻。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值