狀壓dp(洛谷 P1283 平板塗色)

2021-09-26 05:49:28 字數 1389 閱讀 8401

題目鏈結

思考了一會,發現是狀壓dp,

dp[sta][j], 狀態為sta,最後填j號矩形的最小值。

注意的是每個矩形(除了最上面的)都有自己的先導狀態。我們必須記錄。這裡我用pre[i]記錄。即如果想填色第i塊。必須達到的狀態。詳細記錄過程看**。比較好懂。

//mp[i][j]意思是(i,j)座標位置,被那個編號的矩形占用了(-1為空)

for(

int i =

0; i < n; i++

) pre[i]|=

(1<< mp[m[i]

.x1-1]

[j]);if

(pre[i]==0

) dp[

1<[i]=1;

}}

記錄好先導狀態後,就是標準狀壓dp。對於從第j個矩形轉移到第k個,如果兩個矩形顏色一樣則權值為0,否則為1。

下面是ac**:

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int inf =

0x3f3f3f3f

;struct node

m[32];

int mp[

128]

[128];

int dp[

1<<17]

[20];

int pre[32]

;int

main()

// for (int i = 0; i <= 6; i++)

// for

(int i =

0; i < n; i++

) pre[i]|=

(1<< mp[m[i]

.x1-1]

[j]);if

(pre[i]==0

) dp[

1<[i]=1;

}}int mx =(1

<;for

(int sta =

0; sta <= mx; sta++)}

}int ans = inf;

for(

int i =

0; i < n; i++

) ans =

min(ans, dp[mx]

[i])

;printf

("%d\n"

, ans)

;return0;

}

洛谷P1283 平板塗色(dfs)

ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...

P1283 平板塗色

ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...

P1283 平板塗色

p1283 平板塗色 dfs 記憶化搜尋 將矩陣轉化為圖求解,然後我們發現這是個dag,於是就可以愉快地跑搜尋了。進行dfs時,我們可以用類似拓撲排序的方法。每次將上面所有矩形都被刷過 入度in i 0 的滿足條件的矩形用h陣列打個標記 用incol陣列表示目前h陣列中有幾種顏色,然後列舉可轉移狀態...