一些对于题意的理解
查看原帖
一些对于题意的理解
968087
Candy34楼主2024/4/1 19:39

题面有一句话是:“为了提高效率,他从商店出发到每个村庄一次”,这里面的“一次”代表的是仅一次吧,也就是不能重复走同一个点。

for(int i=0;i<=(1<<n)-1;i++){//枚举状态
        for(int j=1;j<=n;j++){//枚举每个状态的售货员的目前位置
            if(!(i&(1<<(j-1)))) continue;//如果该位置不包含于当前状态就跳过
            for(int k=1;k<=n;k++){//枚举点j的出边
                if(i&(1<<(k-1))) {//如果当前状态已经包括点k
                    dp[i][k] = min(dp[i][k],dp[i][j]+graph[j][k]);
                }else{
                    dp[i|(1<<(k-1))][k] = min(dp[i|(1<<(k-1))][k],dp[i][j]+graph[j][k]);
                }
            }
        }
    }

对于这段代码

if(i&(1<<(k-1))) dp[i][k] = min(dp[i][k],dp[i][j]+graph[j][k]);

删掉这行代码是AC代码。但是存在这行代码会得到比答案更优的解,也就是需要考虑同一状态不同位置之间的转移,但是交上去却是WA的。这行代码就是代表这么个想法,得到的答案并不严谨,先不考虑这个。所以得出结论:题中要求经过每个点仅一次,也就是不需要同状态间的转移,也就不需要这行代码。 因此我觉得应该完善题面为经过每个点仅一次,如果分析的不对请帮忙指正,感谢

2024/4/1 19:39
加载中...