社区讨论
状态压缩dp求调 样例没过,输出偏小
P10865[HBCPC2024] Genshin Impact Startup Forbidden III参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjkgijt
- 此快照首次捕获于
- 2025/11/04 04:02 4 个月前
- 此快照最后确认于
- 2025/11/04 04:02 4 个月前
代码如下:
CPP#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<iomanip>
using namespace std;
int n,m,k,cur;
int mp[1010][1010],p[1010][1010];
int t[110],cnt;
int X[5]={0,0,1,0,-1};
int Y[5]={0,1,0,-1,0};
int dp[1<<21];
int lowbit(int x){
return x&-x;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
int x,y,a;
cin>>x>>y>>a;
mp[x][y]=a;
}
int st=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
p[i][j]=cur;
st+=mp[i][j]*(1<<cur)*(1<<cur);
cur++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int q=0;
for(int kk=0;kk<5;kk++){
int ni=i+X[kk],nj=j+Y[kk];
if(mp[ni][nj]){
q+=(1<<p[ni][nj]);
}
}
t[++cnt]=q;
}
}
memset(dp,0x3f,sizeof(dp));
dp[st]=0;
for(int i=st;i>=0;i--){
if(dp[i]==0x3f3f3f3f){
continue;
}
for(int j=1;j<=cnt;j++){
int nxt=i;
int now=t[j];
while(now){
int l=lowbit(now);
//cout<<l<<' '<<i<<" "<<(i&(3*l*l))<<endl;
now-=l;
if(i&(3*(l*l))){
//cout<<'!';
nxt-=l*l;
}
}
dp[nxt]=min(dp[i]+1,dp[nxt]);
}
}
/*for(int i=1;i<=st;i++){
cout<<dp[i]<<' ';
}*/
cout<<dp[0];
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...