這是一道狀壓dp的入門練習題
我們可以預處理出每一行國王的合法擺放方案,然後進行dp。
我們定義f[i][j][k]表示前i行,第i行的狀態為j且使用了k個國王的合法方案數,那麼存在
f[i][j][k]=∑f[i-1][j'][k'],其中j&j'=0,j&j'<<1=0,j&j'>>1=0
注意一點,本題沒有規定k個國王必須放滿n行,所以在任何情況下都可以結束dp。
1 #include 2 #include 3 #include 4 #include 5ac codeusing
namespace
std;
6 typedef long
long
ll;7
intn,k;
8long
long f[10][1
<<10][90
],ans;
9 inline int
read()
14while(c<='
9'&&c>='
0') ret=ret*10+c-'
0',c=getchar();
15return ret*op;16}
17int a[2010],sum[2010
],num;
18 inline int lowbit(int
i) 21
intmain() 31}
32for(int i=1;i<=num;i++)
33if(sum[i]<=k) f[1][a[i]][sum[i]]=1;34
for(int i=2;i<=n;i++) 44}
45for(int i=1;i<=n;i++)
46for(int j=1;j<=num;j++)
47 ans+=f[i][a[j]][k];
48 printf("
%lld\n
",ans);
49return0;
50 }
SCOI2005 互不侵犯
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。只有一行,包含兩個數n,k 1 n 9,0 k n n 方案數3 2 同sgu223 include include include include ...
SCOI2005 互不侵犯
題目描述 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。輸入格式 只有一行,包含兩個數n,k 1 n 9,0 k n n 輸出格式 所得的方案數 ly最可愛啦 這題。想了5分鐘,寫了10分鐘,調了...
SCOI2005 互不侵犯
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。兩個數n,k 1 n 9,0 k n n 方案數。3 2果然啊 狀壓題都是乙個套路 和前面那個noi的題是乙個套路 具體實現也基本一樣 就是記錄的狀態...