求助状压DP(无代码仅思路)
  • 板块学术版
  • 楼主wtcqwq
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/2/5 10:01
  • 上次更新2023/10/28 09:40:44
查看原帖
求助状压DP(无代码仅思路)
241867
wtcqwq楼主2022/2/5 10:01

状态定义: 如果我们去过城市1,去过城市2,没去过城市3,那么可以表示为110110,即55

定义fi,j=f_{i,j}=状态(即二进制状态对应的十进制数)为ii,目前在jj号城市的路程花费最小值。

同时定义: ai,ja_{i,j}为从iijj的路径长度

状态转移方程可以沿用Floyd算法的思想。

枚举ii为状态,jjkk是起点和终点

dp[k2j1][j]=max(dp[k(2(j1))][j],dp[k][i]+a[i][j]) dp[k|2^{j-1}][j] = max(dp[k|(2^{(j-1)})][j],dp[k][i]+a[i][j])

最后答案应该为

min(dp[2n1][i]+a[i][S](1in)(iS))min(dp[2^n-1][i]+a[i][S](1\leq i\leq n)(i\neq S))

此处:

2n1=i=1n12i2^n-1=\sum_{i=1}^{n-1}2^i

所以,状态为2n12^n-1,意思即为,所有的二进制位都是11,加和才会为2n12^n-1

容易证明,在第一个参数——状态的每一位都会有0011两种情况,共2n2^n种。第二个参数——目前所在的城市共有nn种情况。

2022/2/5 10:01
加载中...