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的化简方法:
最终结果应该是:
$$
=((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个。
标签:Minimization,rep,i2,vct,sum,Problem,Yet,dp,ans 来源: https://www.cnblogs.com/tyriis/p/15938511.html