很明顯這題是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][
j]rest[j]表示這個j這個狀態下可以隨意填的點的個數(不計算其他在j狀態下不包括x的點能控制的點,因為這些點填了會有後效性)。
因為題目要求只有x的點的值比周圍的值都小,那麼可能會有一些3*3的都是』.』的點那個中間的點也可能值比周圍的都小。
所以,現在需要容斥一下。
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using
namespace
std;
typedef
long
long ll;
const
int mo=12345678;
int i,j,k,l,t,n,m,cas;
ll ans;
char s[10][10];
int f[30][1
<<8],rest[1
<<8];
int fang[8][2]=;
bool az[10][10];
int suan()}}
}fo(i,1,n)fo(j,1,m)if(!az[i][j])rest[ii]++;
}f[0][0]=1;
fo(i,1,n*m)}}
return f[n*m][(1
<1];
}void dfs(int x,int y,int z)
if(x==n+1)
bool bz=1;
if(s[x][y]=='x')bz=0;
dfs(x,y+1,z);
fo(i,0,7)
if(bz)
}int main()
ans=0;
fo(i,1,n)
if(ans==-1)break;
}if(ans==-1)break;
}if(ans==-1)
ans=0;
dfs(1,1,0);
printf("%lld\n",ans);}}
CQOI2012 區域性極小值
將1,2,3 m n填入乙個m n m nm n的矩陣,要求一些位置滿足比周圍八個數都小,且其他位置不滿足,則一共有幾種方案.首先不考慮 其他位置不滿足 這個要求,因為資料範圍很小,因此最多有8個位置符合條件,可以狀壓dp.考慮將m n m nm n個數從小到大依次填入矩陣,用dp i j dp i...
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個逆序對的方案數一...