当前位置: 首页 > backend >正文

B4172 学习计划 题解

B4172 学习计划 题解

思路

可以将收益式子换一下,设 c i c_i ci a i a_i ai 被分到的段的编号,那收益式子变成 ∑ i = 1 n a i × b c i \sum_{i=1}^n a_i \times b_{c_i} i=1nai×bci

很显然的 dp, 设 f i , j f_{i,j} fi,j 为将 a a a 的前 i i i 个数分成 j j j 段的最大收益。

那现在有两种选择。

  1. a i − 1 a_{i-1} ai1 选的是第 j j j 段,这样的收益是 f i − 1 , j + a i × b j f_{i-1,j}+a_i\times b_j fi1,j+ai×bj
  2. a i − 1 a_{i-1} ai1 选的是第 j − 1 j-1 j1 段,这样的收益是 f i − 1 , j − 1 + a i × b j f_{i-1,j-1}+a_i\times b_j fi1,j1+ai×bj

整理一下就能得到转移方程 f i , j = max ⁡ ( f i − 1 , j , f i − 1 , j − 1 ) + a i × b j f_{i,j}= \max (f_{i-1,j},f_{i-1,j-1})+a_i\times b_j fi,j=max(fi1,j,fi1,j1)+ai×bj

由于有负数,初始值要设为 − inf ⁡ -\inf inf f 0 , 0 f_{0,0} f0,0 设为 0 0 0

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N = 2010;
int a[N], b[N];
int f[N][N];
void run() {memset(f, -0x3f, sizeof(f));int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= m; i++) cin >> b[i];f[0][0] = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= min(i, m); j++)f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i] * b[j];cout << f[n][m] << endl;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int _ = 1;cin >> _;while (_--) run();return 0;
}
http://www.xdnf.cn/news/4114.html

相关文章:

  • Redis常用命令表格汇总(超精炼)
  • 【2025牛客五一集训派对day4 C】题解
  • 【学习笔记】机器学习(Machine Learning) | 第五章(3)| 分类与逻辑回归
  • Linux网络编程 day4
  • 「OC」源码学习——objc_class的bits成员探究
  • 五一作业-day02
  • 软件设计师-错题笔记-程序语言
  • 《Effective java》 第三版 核心笔记
  • 蓝桥杯嵌入式按键长短按移植
  • LeetCode:链表的中间结点
  • Linux的时间同步
  • HTTP/HTTPS协议(请求响应模型、状态码)
  • 1247: 彩色的棋子(chess)
  • 《Spring 中 @Autowired 注解详解》
  • 2023年408真题及答案
  • 读《人生道路的选择》有感
  • Day11 训练
  • 30天开发操作系统 第27天 -- LDT与库
  • Gateway网关:路由和鉴权
  • LeetCode 238:除自身以外数组的乘积(Java实现)
  • CRM客户关系管理系统高级版客户管理销售管理合同管理数据分析TP6.0框架源码
  • 阿里云服务器深度科普:技术架构与未来图景
  • kdump详解
  • 基于SRS实现流媒体服务器(最简单的流媒体服务器)
  • 【外围电路】0.介绍
  • react路由使用方法
  • 【ArUco boards】标定板检测
  • 《架构安全原则》解锁架构安全新密码
  • c++进阶——AVL树主要功能的模拟实现(附带旋转操作讲解)
  • ADK 第四篇 Runner 执行器