[Atcoder DP U]Grouping 题解报告
传送门
状压dp。。。
咱就说从来没有会过。
就是以dp[s]表示s集合任意分组后的权值之和
s二进制:0~(1< 至于为什么非要是真子集
其实很好想到
就是你s肯定是
由除了ta本身之外的子集更新而成的啊
如果数据本身没有负数的话,其实根本不用管ta,因为反正都是0????
so,我们可以将dp数组初始值初始化为一个数据企及不了的最小值。。。
经本人验证,-1e9貌似就🆗了
AC代码
int main(){
...
for(ll i=0;i<(1<<n);i++){
for(ll j=0;j<n;j++){
for(ll k=j+1;k<n;k++){
if((i>>j&1)&&(i>>k&1)){
g[i]+=a[j][k];
}
}
}
}
for(ll i=1;i<(1<<n);i++){
ll mx=-1e9;
for(ll j=i;j;j=(j-1)&i){//j是i的子集
mx=max(mx,f[i^j]+g[j]);//i^j是j在全集i下的补集
}
f[i]=mx;
}
cout<<f[(1<<n)-1];
return 0;
}
完结撒花❀
★,°:.☆( ̄▽ ̄)/$:.°★ 。

浙公网安备 33010602011771号