poj 3420 dp 矩陣 矩形填充

2021-06-18 01:26:16 字數 941 閱讀 1782

#include #include #include #include #include #include using namespace std;

#define ll long long

const int maxn=(1<<4)*4;//乙個狀態可以推出多個狀態

int pre[maxn],now[maxn];

int m,n,t,mod;

struct matrix;

void dfs(int num,int p,int q)

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)}}

return c;

}matrix pow_mod(matrix a,int b)

return s;

}int main()

return 0;}/*

用1*2的方塊填滿n*m的矩陣,當n*m為奇數時,不可能成功。

由於填充方塊可以橫豎變換,所以n和m也可以交換

每行用二進位制數表示狀態,1為有方塊,0為沒方塊(為了給下一行新增豎的方塊)

乙個橫的方塊用11表示,豎的是pre[i]=0,now[1];

pre[i],表示前一行的狀態,now[i]表示在前一行的狀態下,得到的下一行的狀態;

dp[i][now[j]]=dp[i-1][pre[j]];

現在推狀態:

前一行出現11,下一行填11

前一行出現1,下一行填0

之後用dfs找出所有的pre和now,接著就能dp了

這題中n太大,而狀態只有16(1<<4)種,則可以寫出16*16矩陣的進行矩陣連乘加速

*/

POJ 3420 矩陣乘法

題意 4 n的矩形中放入1 2的小矩形有多少種放法 分析 表示公式不會推導。沒找著有人推公式的證明了。求證明 f n f n 1 5 f n 2 f n 3 f n 4 手動算出來前4項,然後處理線性遞推式就好了 view code 1 include 2 include 3 include 4 i...

poj3744 概率dp 矩陣乘法

在一條路上有n個地雷,有個sb人按照心情走在這條路上,往前走1步的概率是p,往前走2步的概率是 1 p 求他活著走過這條路的概率。很容易想到一種dp方程 f i p f i 1 1 p f i 2 然而一看範圍 1,100000000 怎麼可能不超時呢 然後可以這麼想 只要避開了最後乙個地雷不就安全...

poj 3744 概率dp 矩陣快速冪

poj 3744 題目大概是 小明要走一段路 有p的概率走一步 1 p 的概率走兩步 然後上面有雷 問安全通過的概率 題目通過雷把路程分為多段 把每段安全通過的概率相乘 就是整段安全通過的概率 設dp i 是小明安全到i的概率 到i的方式有兩種 一種是從 i 1 走一步 第二種是從 i 2 走兩步 ...