D. Yet Another Minimization Problem

D. Yet Another Minimization Problem

题目大意:

​ 有两个长度相等的数组ab,可以将相同下标的ai,bi交换无限次。求以下式子的最小值。
$$
\sum_{i=1}^{n}\sum_{j = i+1}{n}(a_i+a_j)2+\sum_{i=1}^{n}\sum_{j = i+1}{n}(b_i+b_j)2
$$

思路和代码:

这道题的关键就是化简该公式。因为a和b的式子一样,所以先化简a。
$$
\sum_{i=1}^{n}\sum_{j = i+1}{n}(a_i+a_j)2=\sum_{i=1}^{n}\sum_{j = i+1}{n}(a_{i}{2}+a_{j}^{2}+2a_ia_j)
$$

$$
=(n-1)\sum_{i=1}{n}a_i2+\sum_{i=1}^{n}\sum_{j = i+1}^{n}(2a_ia_j)
$$

$$
=(n-1)\sum_{i=1}{n}a_i2+\sum_{i=1}n(a_i*sum-a_i2)
$$

$$
=(n-2)\sum_{i=1}{n}a_i2+sum*\sum_{i=1}n(a_i)=(n-2)\sum_{i=1}{n}a_i2+sum2
$$

下图是2aiaj的化简方法:
D. Yet Another Minimization Problem

最终结果应该是:
$$
=((n-2)\sum_1n(a_i2+b_i2))+(suma2+sumb^2)
$$
因为不管aibi怎么交换,上述式子的前半部分是不变的,所以我们只要找出后半部分的最小值即可。

利用一个变相的01背包(把取和不取改成交换和不交换)

还有一点要注意的是,01背包是在n个物品里选择若干个使得总价值最优,而这里我们是需要选择全部的n个。所以不能用滚动数组一维优化。

ll solve(){
	ll n , m , k , sum , ans = INF ;
	cin >> n ;
	
	m = sum = k = 0 ;
	vct<ll> a(n + 1 , 0) ;
	vct<ll> b(n + 1 , 0) ;
	rep(i , 1 , n) cin >> a[i] ;
	rep(i , 1 , n) cin >> b[i] ;
	
	if(n == 1) return 0 ;
	
	rep(i , 1 , n) m += max(a[i] , b[i]) ;
	rep(i , 1 , n) sum += a[i] + b[i] ;
	
	vct<vct<bool> > dp(n + 1 , vct<bool> (m + 1 , 0)) ;
	
	dp[0][0] = 1 ;
	
	rep(i , 1 , n)
	rep(j , min(a[i] , b[i]) , m){
		if(j >= a[i] && !dp[i][j]) dp[i][j] = dp[i - 1][j - a[i]] ;
		if(j >= b[i] && !dp[i][j]) dp[i][j] = dp[i - 1][j - b[i]] ;
	}
	rep(i , 1 , m)
		if(dp[n][i])ans = min(ans , i * i + (sum - i) * (sum - i)) ;
	
	rep(i , 1 , n) k += a[i] * a[i] + b[i] * b[i] ;
	return ans + (n - 2) * k ;
	
}//code_by_tyrii 
小结:

式子的推导可以用具体数量来看。

基础算法能解决的问题不能混淆,就像普通01背包是前n个而不是全部n个。

上一篇:极限理论03:CLT与Edgeworth展开


下一篇:最大公约数的三种求法(C语言练习实例16)