[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;
}

完结撒花❀
★,°:.☆( ̄▽ ̄)/$:.°★

posted @ 2022-07-10 21:31  _Youngxy  阅读(114)  评论(0)    收藏  举报