將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個逆序對的方案數一...