在n*n(1<=n<=10)的棋盤上放k(0<=k<=n*n)個國王(可攻擊相鄰的8 個格仔),求使它們無法互相攻擊的方案總數。
輸入檔案僅一行為兩個整數n和k。
輸出檔案僅一行為方案總數,若不能夠放置則輸出0。
3 2【樣例輸入2】
4 4【樣例輸出2】
79一眼狀壓,用1表示國王(話說真的不知道這個翻譯在幹什麼,到底是國王還是騎士啊……)
但是不能裸上,合法狀態事實上並不多,預處理一下每行的合法狀態,即不允許相鄰的1,存在陣列s裡
方程:當i - 1行的狀態為s[p],i行的狀態為s[j],且s[j]和s[p]不衝突時,f[i][j][k] += f[i - 1][p][k - sum[j]]; 其中sum表示該狀態1的個數,f[i][j][k]表示前i行中第i行為狀態s[j]且共有k個1
#include #define lowbit(x) x & -x
using namespace std;
const int maxs = 1050;
const int maxn = 11;
const int inf = 0x3f3f3f3f;
template inline void read(t &x)
}for (; isdigit(ch); ch = getchar())
if (fg) }
typedef pairpii;
typedef long long ll;
int s[maxs], cnt, n, all, sum[maxs], k;
ll f[maxn][maxs][maxn * maxn];
bool legal(int i)
void init() }}
bool chk(int s, int s0)
namespace dp
void dp() } }
}} }}
signed main()
printf("%lld\n", ans);
return 0;
}
AcWing1064 騎士(狀壓DP)題解
題目傳送門 題目描述 在 n n 的棋盤上放 k 個國王,國王可攻擊相鄰的 8 個格仔,求使它們無法互相攻擊的方案總數。輸入格式 共一行,包含兩個整數 n 和 k。輸出格式 共一行,表示方案總數,若不能夠放置則輸出00。資料範圍1 n 10 0 k n 2 輸入樣例 3 2 輸出樣例 題解 狀態壓縮...
LOJ 10172 塗抹果醬 狀壓DP
題目描述 看完題目,很清楚的想到這道題用狀壓dp來做,只不過這道題是個三進製的,做題過程中須注意轉換。下面簡單說一下演算法 1.用0 1 2 來代替題目中的1 2 3這樣比較方便,將第k行以三進製數存入。先用乙個陣列存所以可行的狀態,若第k行的狀態不在陣列裡,直接輸出0.2.這道題中已經給出了一行的...
loj 1021 狀壓dp 記憶化搜尋)
題目大意 給定的乙個某進製下的排列,問它的全排列有多少個能夠整除給定的十進位制下的數字k。思路 記憶化搜尋,dp state r 表示在某狀態下被k除餘數為r有多少個。1 include2 include3 include4 include5 include6 using namespace std...