2331 SCOI2011 地板 插頭DP

2022-05-02 02:09:08 字數 2855 閱讀 6928

國際慣例的題面:

十分顯然的插頭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行沒有插頭的狀態。

**:

1

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

view code

たいせつなきみのために ぼくにできるいちばんのことは

為了最重要的你 我所能做的最好的事

約束を忘れること君への想い消し去ること

就是忘卻與你的約定抹去對你的思念

沈む夕日暮れてく空 夜の帳舞い降りる頃

漸漸歸隱大地的夕陽 夜幕降臨整個天空 夜的氣息輕盈飄落之時

僕は目を閉じて それは暗に溶けるように 滲んで消えた

我閉目去感受 一切就像溶入暗影一樣 滲透進去消散無痕了

未來なんていらないよ

未來(明日)什麼的已經不需要了吧

君が側にいる過去のままで

因為有你一直陪伴我的往昔(昨日)

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種情況 ...