CQOI2012 區域性極小值

2021-07-16 17:30:12 字數 1459 閱讀 4758

很明顯這題是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個逆序對的方案數一...