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

取数游戏2(动态规划java)

取数游戏2

题目描述

给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。

输入格式

第一行一个数T ,表示有T 组数据。对于每组数据,第一行一个整数 n ,接下来两行分别给出 A 数列与B 数列。

输出格式

每一组数据输出一行,最大的∑vi。

样例输入输出

样例输入

 
2
2
1 1000
2 1
5
1 3 5 2 4
1 2 3 4 5

样例输出

2001
52

数据范围

对于100的数据,保证 T≤10,1≤n≤1000,1≤ai,bi≤1000。

算法思路

首先题目中说的是每次取A数列的左端或右端,而B数列取的是第i个元素,暴力解的思路肯定就是通过回溯算法,把所有的情况尝试出来,但是这种思路肯定是会超时的,所以采用优化的算法动态规划。
首先定义dp数组的意义,因为最后要求的是A数列和B数列得出的∑vi最大值,所以可以定义为dp[0][n-1]为A数列[0 ~ n-1]得出的∑vi最大值,而dp[i][j]表示的是A数列[i ~ j]计算出来的∑vi最大值。
按照这个思路继续,继续推断递推公式,因为题干中说的是每次从A数列左端或右端取走一个数,并且乘上B数列的第i个元素,我们可以反向操作,初始的时候A数列没有元素,每次在左端或右端添加一个数,并且乘上B数列的第n-i个元素,通过这种逆向思路变可以推断出递推公式,既然每次是在左端或右端添加数,对于dp[i][j]的值来说,可能是由于dp[i+1][j]添加左端的数并且乘上B数列对应的元素得到的,也可能是dp[i][j-1]乘上B数列对应的元素得到的,取两者的最大值,那么就可以得出递推公式是dp[i][j]=max(dp[i+1][j]+B[n-j+i-1]*A[i],dp[i][j-1]+B[n-j+i-1]*A[j]),其中B[n-j+i-1]是左端或者右端添加数对应的B数列元素。
那么最后就是开始遍历dp数组来算出每个值了,其中dp数组的初始化有一个规律,就是最开始取的A数列的元素一定是乘上B数列中的最后的元素,因为dp[i]j的时候代表的意义一定是只有一个数的时候,所以在初始化dp数组的时候,让dp对角线元素等于A数列对应的元素乘上B数列最后一个元素作为初始值。
在这里插入图片描述
如上图,按照题干的测试案例给出的每个数组的值,其中dp数组是按照下面的元素和左面的元素来推断出来的,最后dp[0][4]便是答案。

代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int T = scanner.nextInt();while (T>0){T-=1;//定义输入数据的初始化int n = scanner.nextInt();int []A = new int[n];int []B = new int[n];int [][]dp=new int[n][n];for(int i=0;i<n;++i){A[i]= scanner.nextInt();}for(int i=0;i<n;++i){B[i]= scanner.nextInt();}//让对角线上的元素等于B数组最后一个元素和A数组的第i个元素,动态规划的数组初始化for(int i=0;i<n;++i){dp[i][i]=A[i]*B[n-1];}for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;++j){//递推公式dp[i][j]=Math.max(dp[i+1][j]+B[n-j+i-1]*A[i],dp[i][j-1]+B[n-j+i-1]*A[j]);}}System.out.println(dp[0][n-1]);}}
}
http://www.lryc.cn/news/239165.html

相关文章:

  • Spring Boot中配置文件生效位置
  • AIGC创作系统ChatGPT网站系统源码,支持最新GPT-4-Turbo模型
  • 【JavaEE】操作系统与进程
  • 【MATLAB源码-第86期】基于matlab的QC-LDPC码性能仿真,输出误码率曲线。
  • 【0236】聊一聊PG内核中的命令标签(Command Tags、CommandTag、tag_behavior)
  • Python武器库开发-flask篇之error404(二十七)
  • 录屏软件自动开启录视频,是如何实现的?
  • 模拟shell小程序
  • webpack配置全局scss
  • 想面试前端工程师,必须掌握哪些知识和技能?【云驻共创】
  • 京东数据分析(京东数据采集):2023年10月京东平板电视行业品牌销售排行榜
  • 在 Linux 中,可以使用分号 (;) 或者 运算符来执行多条命令
  • 一些必备的 Redis 命令 | Navicat
  • 神经网络常用激活函数详解
  • UVA11584划分成回文串 Partitioning by Palindromes
  • 第十一章 将对象映射到 XML - 控制流属性的映射形式
  • torchvision中的标准ResNet50网络结构
  • Java 多线程之 synchronized (互拆锁/排他锁/非观锁)
  • 开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势未来发展方向
  • 如何使用无代码系统搭建软件平台?有哪些开源无代码开发平台?
  • 微信怎么设置自动回复?
  • 基于Vue3的低代码开发平台——JNPF
  • Thinkphp6 模型 指定字段自增的方法
  • WhatsApp开发客户攻略来袭!还有你不知道的账号解封秘籍!
  • Linux C 基于tcp多线程在线聊天室
  • 代码随想录算法训练营第23期day60|84.柱状图中最大的矩形
  • vue动态获取目录结构进行配置静态路由
  • 产品工程师工作的职责十篇(合集)
  • 图片降噪软件 Topaz DeNoise AI mac中文版功能
  • 【开源】基于Vue.js的车险自助理赔系统的设计和实现