对于状压 dp 我的数组下标从 0 开始存,然后有了下面两份提交记录:
代码:
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;
}
两份代码只有数组大小存在差异,我觉得应该没有影响啊,但是为什么只开 12 会寄?