关于数组大小的疑问 & 警示后人
查看原帖
关于数组大小的疑问 & 警示后人
468657
lsj2009Isj2OO9楼主2023/8/19 16:07
  • 如果你觉得自己写得很对,但是没过样例/WA0,看一下自己有没有把 dp 数组第二维成 2n2^n 的大小。

对于状压 dp 我的数组下标从 00 开始存,然后有了下面两份提交记录:

RE and AC

代码:

RE:

#include<bits/stdc++.h>
//#define int long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=12,M=1<<12,S=1e6+5;
int e[N][N],f[N][M],n,m;
signed main() {
	scanf("%d%d",&n,&m);
	cl(e,0x3f);
	rep(i,1,m) {
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		--u; --v;
		e[u][v]=min(e[u][v],w);
		e[v][u]=min(e[v][u],w);
	}
	cl(f,0x3f);
	rep(i,0,n-1)
		f[1][1<<i]=0;
	rep(S,0,(1<<n)-1) {
		for(int T=S&(S-1);T;T=(T-1)&S) {
			int tot=0;
			rep(v,0,n-1) {
				if((T>>v)&1) {
					int res=5e5;
					rep(u,0,n-1) {
						if((((S^T)>>u)&1))
							res=min(res,e[u][v]);
					}
					tot+=res;
				}
			}
			rep(d,2,n)
				f[d][S]=min(f[d][S],f[d-1][S^T]+tot*(d-1));
		}
	}
	int ans=INF;
	rep(i,1,n)
		ans=min(ans,f[i][(1<<n)-1]);
	printf("%d\n",ans);
    return 0;
}

AC:

#include<bits/stdc++.h>
//#define int long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=15,M=1<<15,S=1e6+5;
int e[N][N],f[N][M],n,m;
signed main() {
	scanf("%d%d",&n,&m);
	cl(e,0x3f);
	rep(i,1,m) {
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		--u; --v;
		e[u][v]=min(e[u][v],w);
		e[v][u]=min(e[v][u],w);
	}
	cl(f,0x3f);
	rep(i,0,n-1)
		f[1][1<<i]=0;
	rep(S,0,(1<<n)-1) {
		for(int T=S&(S-1);T;T=(T-1)&S) {
			int tot=0;
			rep(v,0,n-1) {
				if((T>>v)&1) {
					int res=5e5;
					rep(u,0,n-1) {
						if((((S^T)>>u)&1))
							res=min(res,e[u][v]);
					}
					tot+=res;
				}
			}
			rep(d,2,n)
				f[d][S]=min(f[d][S],f[d-1][S^T]+tot*(d-1));
		}
	}
	int ans=INF;
	rep(i,1,n)
		ans=min(ans,f[i][(1<<n)-1]);
	printf("%d\n",ans);
    return 0;
}

两份代码只有数组大小存在差异,我觉得应该没有影响啊,但是为什么只开 1212 会寄?

2023/8/19 16:07
加载中...