众所周知 P1896 [SCOI2005] 互不侵犯 是一道状压DP 所以我就这样写了一个代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fp(x,y,z) for(int z=x; z<=y; z++)
#define impc ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
int N,K;
int dp[10][101][205];
//dp[i][j][k] 表示 到第i行已经放了j个国王的第k种状态
int s[2005], tot; //存储所有状态信息
int sum[2005]; //每种状态有多少个国王
int find1(int a){
int sm = 0;
while(a){
if(a&1){
sm++;
}
a >>= 1;
}
return sm;
}
signed main(){
impc
cin >> N >> K;
fp(0,(1<<N)-1,i){ //需要枚举出所有满足同行条件的状态
if( ((i<<1)&i)|((i>>1)&i) ) continue;
else{
s[++tot] = i; //记录
sum[tot] = find1(i); //记录有多少个1
}
}
dp[0][0][1] = 1;
fp(1,N,i){ //枚举放到了几行
fp(1,tot,j){ //枚举这一行的状态
int sis = s[j];
fp(1,tot,k){ //枚举上一行的状态
int sup = s[k];
if( !(((sis<<1)&sup) | ((sis>>1)&sup) | (sis&sup)) ){
fp(0,K,l){ //枚举国王数量
dp[i][l][j] += dp[i-1][l-sum[j]][k];
}
}
}
}
}
int ans = 0;
fp(1,tot,i) ans+=dp[N][K][i];
cout << ans;
return 0;
}
但是我在洛谷上提交这份代码就AC了,在【这是记录】,在Accoders上提交却只有9分WA掉,把数组开大也最多得18分,开多了就RE【这是记录】
数据范围都一模一样,洛谷的空间甚至卡得更死,想不清为什么会这样