國際慣例的題面:
十分顯然的插頭dp。由於r*c<=100,所以min(r,c)<=10,然後就可以愉悅地狀壓啦。
我們用三進製狀壓,0表示沒有插頭,1表示有乙個必須延伸至少一格且拐彎的插頭,2表示有乙個必須延伸一格且不可以拐彎的插頭。
轉移的話就十分顯然了。
00->22,表示用這個格仔作為開始的拐角。
00->10,表示用這個格仔向下延伸。
00->01,表示用這個格仔向右延伸。
01->10,表示這個格仔連線上下。
01->02,表示在這個格仔作為中間的拐角。
02->20,表示這個格仔連線上下。
02->00,表示這個格仔作為某個地板的終點。
10->01,表示這個格仔連線左右。
10->20,表示在這個格仔作為中間的拐角。
11->00,表示這個格仔作為結束的拐角。
20->00,表示這個格仔作為某個地板的終點。
20->02,表示這個格仔連線左右。
(插頭dp的本質就是分類討論,所以麻煩也沒辦法,想明白就很容易了)
然後就是實現了。我是用unordered_map儲存狀態,同時先找到第乙個可以放東西的位置開始dp,統計答案的時候統計第n+1行沒有插頭的狀態。
**:
1view code#pragma gcc optimize(2)
2 #include3 #include4 #include5
using
namespace
std;
6using
namespace
tr1;
7const
int maxn=1e2+1e2;
8const
int mod=20110520;9
10int
sta[maxn],nxt[maxn];
11char
in[maxn][maxn]; //
in == 1 means empty .
12int
n,m,cur,fx,fy;
13 unordered_map f[2
];14
15 inline void unzip(int* sta,int
ss)
18 inline int zip(int*sta)
2324 inline void core_trans(unordered_map &dst,int x,int y,int
add)
30if( sta[y] == 0
) else
if( sta[y+1] == 1
) else
if( sta[y+1] == 2
) 42 } else
if( sta[y] == 1
) else
if( sta[y+1] == 1 ) nxt[y] = 0 , nxt[y+1] = 0 , ( dst[zip(nxt)] += add ) %=mod;
47 } else
if( sta[y] == 2
) 52}53
}54 inline void trans(const unordered_map &sou,unordered_map &dst,int x,int
y) 59
}60 inline void transline(const unordered_map &sou,unordered_map &dst) 65}
6667 inline void revert()
7374
intmain()
8081
if( n
82for(int i=1;i<=n&&!~fx;i++) for(int j=1;j<=m&&!~fx;j++) if(in[i][j]) fx = i , fy =j;
83if( !~fx ) return puts("
1") , 0; //
nothing to do .
84 sta[fy] = 0 , sta[fy+1] = 1 , f[cur][zip(sta)] = 1
;85 sta[fy] = 1 , sta[fy+1] = 0 , f[cur][zip(sta)] = 1
;86 sta[fy] = sta[fy+1] = 2 , f[cur][zip(sta)] = 1;87
for(int j=fy+1;j<=m;j++) trans(f[cur],f[cur^1],fx,j) , cur ^= 1
;88 transline(f[cur],f[cur^1]) , cur ^= 1;89
90for(int i=fx+1;i<=n;i++)
9596 printf("
%d\n
",f[cur][0
]);97
98return0;
99 }
たいせつなきみのために ぼくにできるいちばんのことは
為了最重要的你 我所能做的最好的事
約束を忘れること君への想い消し去ること
就是忘卻與你的約定抹去對你的思念
沈む夕日暮れてく空 夜の帳舞い降りる頃
漸漸歸隱大地的夕陽 夜幕降臨整個天空 夜的氣息輕盈飄落之時
僕は目を閉じて それは暗に溶けるように 滲んで消えた
我閉目去感受 一切就像溶入暗影一樣 滲透進去消散無痕了
未來なんていらないよ
未來(明日)什麼的已經不需要了吧
君が側にいる過去のままで
因為有你一直陪伴我的往昔(昨日)
BZOJ2331 SCOI2011 地板 題解
題面複製於洛谷 鋪設完成後,客廳裡面所有沒有柱子的地方都必須鋪上地板,但同乙個地方不能被鋪多次。輸入格式 輸入的第一行包含兩個整數,r和c,表示客廳的大小。接著是r行,每行c個字元。表示對應的位置是空的,必須鋪地板 表示對應的位置有柱子,不能鋪地板。輸出格式 輸出一行,包含乙個整數,表示鋪滿整個客廳...
P2331 SCOI2005 最大子矩陣
這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。其中 1 le n le 100,1 le m le 2,1 le k le 10.m 只有 1 和 2 兩種取值,所以直接討論就好 m 1 時 是前 k 個最大連續欄位和 定義 f ...
P2331 SCOI2005 最大子矩陣
傳送門 首先感謝ccsc友 xi 好 zhi 的講解 康康m的範圍 m只能取1或者2 先看m 1 是一條鏈 那麼對於第i個點有三種情況 1 和上面連在一起成乙個矩陣 2 和下面連在一起成乙個矩陣 3 成為斷點 同樣的 對於m 2我們也這樣分析 設f i j k 代表第i行取了j個矩陣屬於第k種情況 ...