碰到离谱的了
  • 板块灌水区
  • 楼主Diode123
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/4/1 16:47
  • 上次更新2024/4/1 19:31:14
查看原帖
碰到离谱的了
824457
Diode123楼主2024/4/1 16:47

众所周知 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【这是记录】

数据范围都一模一样,洛谷的空间甚至卡得更死,想不清为什么会这样

2024/4/1 16:47
加载中...