传送门 先预处理出来一行中放置国王的所有情况和每种情况所用的国王个数. f[i][j][k]表示前i行放j个国王且最后一行的状态为k的方案数 状压DP即可 #include <cstdio> #define N 1001 int n, m, cnt, ans; int a[N][2], f[10][82][N]; inline void dfs(int s, int k, int last) { if(k > m) return; int i, j; cnt++; a[cnt][0] =…
显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 #include<iostream> #include<cstdio> using namespace std; const int N=2005; long long n,kk,a[N],sum[N],tot,t,m,f[10][30][1005],ans; bool v[N][N]; int main() { scanf("…
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostream> #include <cstdio> using namespace std; #define N 1<<9 long long ans; int n,m; int ok_1[N],cnt[N]; int ok_2[N][N]; ][*+][N]; void init()…