CQOI2012 區域性極小值

2021-09-18 05:53:23 字數 1438 閱讀 8981

將1,2,3…,m*n填入乙個m∗n

m*nm∗

n的矩陣,要求一些位置滿足比周圍八個數都小,且其他位置不滿足,則一共有幾種方案.

首先不考慮"其他位置不滿足"這個要求,因為資料範圍很小,因此最多有8個位置符合條件,可以狀壓dp.考慮將m∗n

m*nm∗

n個數從小到大依次填入矩陣,用dp[

i][j

]dp[i][j]

dp[i][

j]表示當前要求位置填的數的狀態為i,其他位置一共填了j個的方案數,即可求出答案.

然後考慮其他位置,可以進行容斥,暴力搜尋出哪些位置也滿足比周圍的數都小,然後用上述dp即可求出方案數,從而得到答案.

#include

#define ll long long

#define n 10

#define m 12345678

using

namespace std;

ll m,n,ans,x[n]

,y[n]

,dp[

260][30

];char mm[n]

[n];

inline

void

add(ll &u,ll v)

inline

voidgg(

)inline ll calc()

}}for(i=

0;i<(1

<< cx)

;i++

)memset

(dp[i],0

,sizeof

(dp[i]))

; dp[0]

[0]=

1;for(i=

0;i<(1

<< cx)

;i++)}

}for

(ii=

1;ii<=m;ii++)}

for(j=

0;j<=m*n-cx;j++)if

(jadd(dp[i]

[j+1

],dp[i]

[j]*

(cnt-j)

%m);}}

return dp[(1

<< cx)-1

][m*n-cx];}

void

dfs(ll u,ll v,ll zf)

ll i,j;

if(v==n)

dfs(u+1,

1,zf)

;else

dfs(u,v+

1,zf)

;for

(i=u-

1;i<=u+

1;i++)if

(j<=v+1)

break;}

if(i>u+1)

}int

main()

}dfs(1

,1,1

);cout<}

CQOI2012 區域性極小值

很明顯這題是dp,不過比賽的時候沒有考慮狀壓。因為有x的點最多只有8個,那麼可以考慮狀壓。因為要求有x的點比周圍的點小,那麼可以把數從小到大填。設f i j 表示數值已經填到了第i個數,x點填的狀態為j。轉移方程 f i j k jf i 1 j k ma x 0,rest j i 1 f i 1 ...

P3160 CQOI2012 區域性極小值

p3160 cqoi2012 區域性極小值 一眼就是狀壓,接下來就不知道了 qwq 我們能手玩出區域性小值最多差不多是 8,9 個的樣子,dp 為填滿 1 i 數字,區域性小值的狀態為 j 第 k 個區域性極小值填 i dp i j dp i j dp i 1 j 1 不填在區域性極小值,顯然有些地...

bzoj 2669 區域性極小值

bzoj 2669 區域性極小值 有乙個n行m列的整數矩陣,其中1到nm之間的每個整數恰好出現一次。如果乙個格仔比所有相鄰格仔 相鄰是指有公共邊或公共頂點 都小,我們說這個格仔是區域性極小值。給出所有區域性極小值的位置,你的任務是判斷有多少個可能的矩陣。有乙個和dp求n的排列中有k個逆序對的方案數一...