Codeforces Global Round 19 D题 Yet Another Minimization Problem(推式子,01背包变形)

embedded/2024/9/25 2:02:27/

题目链接

https://codeforces.com/problemset/problem/1637/D

思路

对于原式子进行推导

∑ i = 1 n ∑ j = i + 1 n ( a i + a j ) 2 + ∑ i = 1 n ∑ j = i + 1 n ( b i + b j ) 2 \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} i=1nj=i+1n(ai+aj)2+i=1nj=i+1n(bi+bj)2

= = = ∑ i = 1 n ∑ j = i + 1 n ( a i 2 + a j 2 + b i 2 + b j 2 ) + ∑ i = 1 n ∑ j = i + 1 n ( 2 × ( a i a j + b i b j ) ) \sum_{i=1}^{n} \sum_{j=i+1}^{n}(a_{i}^{2}+ a_{j}^{2}+b_{i}^{2}+b_{j}^{2}) + \sum_{i=1}^{n} \sum_{j=i+1}^{n}(2 \times (a_{i}a_{j}+b_{i}b_{j})) i=1nj=i+1n(ai2+aj2+bi2+bj2)+i=1nj=i+1n(2×(aiaj+bibj))

可以发现, ∑ i = 1 n ∑ j = i + 1 n ( a i 2 + a j 2 + b i 2 + b j 2 ) \sum_{i=1}^{n} \sum_{j=i+1}^{n}(a_{i}^{2}+ a_{j}^{2}+b_{i}^{2}+b_{j}^{2}) i=1nj=i+1n(ai2+aj2+bi2+bj2)是一个定值,我们只需要计算 ∑ i = 1 n ∑ j = i + 1 n ( 2 × ( a i a j + b i b j ) ) \sum_{i=1}^{n} \sum_{j=i+1}^{n}(2 \times (a_{i}a_{j}+b_{i}b_{j})) i=1nj=i+1n(2×(aiaj+bibj))的最小值即可。

我们定义 s u m [ i ] = ∑ j = 1 i a j + ∑ j = 1 i b j sum[i] = \sum_{j=1}^{i} a_{j} + \sum_{j=1}^{i} b_{j} sum[i]=j=1iaj+j=1ibj

考虑使用 d p dp dp。我们定义 d p [ i ] [ j ] dp[i][j] dp[i][j]表示只考虑前 i i i位时, a a a数组的背包容量为 j j j时的最小值。(先不考虑系数 2 2 2,因此最后的结果为答案的一半)。

若不交换 a i a_{i} ai b i b_{i} bi,则状态转移方程为:

d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , d p [ i − 1 ] [ j − a [ i ] ] + a [ i ] ∗ ( j − a [ i ] ) + b [ i ] ∗ ( s u m [ i − 1 ] − j + a [ i ] ) ) dp[i][j] = min(dp[i][j], dp[i - 1][j - a[i]] + a[i] * (j - a[i]) + b[i] * (sum[i - 1] - j + a[i])) dp[i][j]=min(dp[i][j],dp[i1][ja[i]]+a[i](ja[i])+b[i](sum[i1]j+a[i]))

若交换 a i a_{i} ai b i b_{i} bi,则状态转移方程为:

d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , d p [ i − 1 ] [ j − b [ i ] ] + b [ i ] ∗ ( j − b [ i ] ) + a [ i ] ∗ ( s u m [ i − 1 ] − j + b [ i ] ) ) dp[i][j] = min(dp[i][j], dp[i - 1][j - b[i]] + b[i] * (j - b[i]) + a[i] * (sum[i - 1] - j + b[i])) dp[i][j]=min(dp[i][j],dp[i1][jb[i]]+b[i](jb[i])+a[i](sum[i1]j+b[i]))

最终的答案即为: ∑ i = 1 n ∑ j = i + 1 n ( a i 2 + a j 2 + b i 2 + b j 2 ) \sum_{i=1}^{n} \sum_{j=i+1}^{n}(a_{i}^{2}+ a_{j}^{2}+b_{i}^{2}+b_{j}^{2}) i=1nj=i+1n(ai2+aj2+bi2+bj2) + + + m i n i = 1 m a x d p n , i min_{i=1}^{max}dp_{n,i} mini=1maxdpn,i

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e2 + 5, M = 1e4 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f;
int n;
int a[N], b[N], sum[N], dp[N][M];
void solve()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i <= n; i++){cin >> b[i];}int ans = 0;for (int i = 1; i < n; i++){for (int j = i + 1; j <= n; j++){ans += (pow(a[i], 2) + pow(a[j], 2));ans += (pow(b[i], 2) + pow(b[j], 2));}}for (int i = 1; i <= n; i++){sum[i] = sum[i - 1] + a[i] + b[i];}for (int i = 1; i <= n; i++){for (int j = 0; j <= 1e4; j++){dp[i][j] = inf;}}dp[0][0] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= 1e4; j++){if (j >= a[i] && (sum[i - 1] - j + a[i]) >= 0)dp[i][j] = min(dp[i][j], dp[i - 1][j - a[i]] + a[i] * (j - a[i]) + b[i] * (sum[i - 1] - j + a[i]));if (j >= b[i] && (sum[i - 1] - j + b[i]) >= 0)dp[i][j] = min(dp[i][j], dp[i - 1][j - b[i]] + b[i] * (j - b[i]) + a[i] * (sum[i - 1] - j + b[i]));}}int res = inf;for (int i = 1; i <= 1e4; i++)res = min(res, dp[n][i]);cout << ans + res * 2 << endl;}
signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

http://www.ppmy.cn/embedded/116383.html

相关文章

模拟哈希表

#include<iostream> #include<cstring>using namespace std; const int N100010; int h[N],e[N],ne[N]; int idx0;void insert(int x) {int t(x%NN)%N;//模拟链表插入e[idx]x,ne[idx]h[t],h[t]idx; }bool find(int x) {int t(x%NN)%N;th[t];while(t!-1)if(e[t]x)re…

PyRosetta优化蛋白质和小分子的结合

在小分子药物研究中,PyRosetta 提供了强大的工具来筛选与蛋白质结构相互作用的小分子药物。可以利用 PyRosetta 来计算配体与受体蛋白的结合能量、生成低能量构象以及优化分子对接模型。下面是一个演示代码,展示如何使用 PyRosetta 来筛选小分子药物与蛋白质的相互作用。 核…

Centos Stream 9+PHP8+TP8+Workerman4.1+Nginx代理SSL

由于项目需要,新到的服务器需要配置安装标题的环境,搞了两天踩了一个大坑,自己粗心了,没办法。记录一下,希望可以给您一些帮助。 一、环境需求: centos stream9、php8以上、nginx1.24、tp8、workerman4.1、由于是内网跑的,所以用上mkcert创建证书,用nginx代理websock…

【每日一题】LeetCode 2207.字符串中最多数目的子序列(贪心、字符串、前缀和)

【每日一题】LeetCode 2207.字符串中最多数目的子序列&#xff08;贪心、字符串、前缀和&#xff09; 题目描述 给定一个字符串 text 和一个长度为2的字符串 pattern&#xff0c;两者都由小写英文字母组成。你可以在 text 中任意位置插入一个字符&#xff0c;这个插入的字符必…

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键&#xff0c;特别是在处理大数据或高频率信号时&#xff0c;优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register&#xff08;移位寄存器&#xff09; 是 LabVIE…

C#基于SkiaSharp实现印章管理(7)

印章中的文本主要分为两种&#xff1a;1&#xff09;从左向右水平绘制的文本&#xff1b;2&#xff09;沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本&#xff0c;后者则使用SKCanvas的DrawTextOnPath绘制文本。   针对上述情况&#xff0c;调整SealElement类型…

JavaWeb JavaScript 11.XML —— 配置文件

生活想埋没我&#xff0c;没想到我是颗种子 —— 24.9.19 一、XML 1.什么是XML XML是EXtensible Markup Languge的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签 可扩展 三个字…

Leetcode42. 接雨水

讲的好的视频讲解 【很难想象这up刷题的精神状态 Leetcode42. 接雨水】 https://www.bilibili.com/video/BV1MC411n7Af/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a rm是right max的意思&#xff0c;lm是left max的意思 时间复杂度&#xff1a; O (…