首页 > 其他分享 >NC14701 取数游戏2

NC14701 取数游戏2

时间:2022-08-15 00:44:22浏览次数:95  
标签:取走 游戏 int vi 取数 NC14701 1007 dp 数列

题目链接

题目

题目描述

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

输入描述

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

输出描述

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

示例1

输入

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

输出

2001
52

说明

对于第二个样例,
第一次从左边取走a1,v1=a1⋅b1=1,
第二次从左边取走a2,v2=a2⋅b2=6,
第三次从右边取走a5,v3=a5⋅b3=12,
第四次从右边取走a4,v4=a4⋅b4=8,
第五次取走剩下的a3,v5=a3⋅b5=25。
总价值∑vi=1+6+12+8+25=52

备注

\(T≤10\)
\(1≤n≤10^3\)
\(1≤a_i,b_i≤10^3\)

题解

知识点:区间dp。

这类题有个很显然的特征,即每次只能选剩余的左右两端的数,可以考虑区间dp逆推整个过程,从只剩一个数作为终点逆推回原来的数列,然后取其中过程中的最大值即可。

设 \(dp[i][j]\) 为用区间 \([i,j]\) 里的数作为第 \([n-(j-i),n]\) 个数时能够到达的最大值。有转移方程:

\[dp[i][j] = \max (dp[i + 1][j] + a[i] \cdot b[n - l + 1], dp[i][j - 1] + a[j] \cdot b[n - l + 1]) \]

表示选左端点或者右端点作为第 \(n-l+1\) 个数。

时间复杂度 \(O(n^2)\)

空间复杂度 \(O(n^2)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int a[1007], b[1007], dp[1007][1007];

bool solve() {
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i <= n;i++) cin >> b[i];
    for (int i = 1;i <= n;i++) dp[i][i] = a[i] * b[n];
    for (int l = 2;l <= n;l++) {
        for (int i = 1, j = l;j <= n;i++, j++) {
            dp[i][j] = max(dp[i + 1][j] + a[i] * b[n - l + 1], dp[i][j - 1] + a[j] * b[n - l + 1]);
        }
    }
    cout << dp[1][n] << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

标签:取走,游戏,int,vi,取数,NC14701,1007,dp,数列
From: https://www.cnblogs.com/BlankYang/p/16586827.html

相关文章

  • 第9天,8-14这几天开始玩游戏了,应该总结一下
    首先,我肯定错了。我想深究一下这里面错误的原因,那么可以不可以以后都不再犯?我觉得可以不再犯,但是能不能达到举一反三的地步? 我觉得理论上是可以的,但是现实中比较难,因为......
  • 【游戏开发基础知识】渲染篇
    什么是渲染管线?如何绘制3D物体?https://www.bilibili.com/video/BV1qY4y1V79z/?spm_id_from=333.788&vd_source=61ce3b4e97cb6ce7f80ca3f58607b5fb1、前期CPU需要为GPU准......
  • Django中读取数据的一些学习
    Django中读取数据的一些学习关于元组的读取​ 当我们在写数据库架构时,我们需要考虑数据库内存,而经常的操作是,比如对于gender,固定值一般为男、女,但是一直写男女中文字符过......
  • Solution -「NOI 2017」「洛谷 P3825」游戏
    \(\mathscr{Description}\)  Link.  给大家看个乐子:link,懒得概括题意啦.\(\mathscr{Solution}\)  对于没有X的情况,显然可以2-SAT;对于有X的情况,暴......
  • 汪子熙趣味成语接龙的游戏软件设计架构说明
    @目录背景战士阿短编程猫纸片初始化函数当开始被点击当收到广播“转盘停止”当收到广播“开始接龙”本作品采用Kitten编程猫v3.7.11开发而成。工程里主要包含一个背景......
  • 趣味成语接龙游戏里,如何判断用户输入的成语接龙成功?
    本文给出了一种解决方案,采用如下的kitten积木组合块实现。根据变量“检查接龙的返回值”,分别执行相应的逻辑。如果返回值为-1,说明用户输入的词语长度不为4.如果返回......
  • 汪子熙趣味成语接龙游戏的设计初衷
    我国的汉语博大精深,其中数以万计的四字成语更是汉语中一颗颗璀璨的明珠,凝聚着中华民族几千年文明的精华。从小接触这些成语,对于小学生积累语汇,提高文学素养,和学习文言文方......
  • 使用 Kitten 开发一款趣味成语接龙游戏
    每一轮接龙成功后,初始接龙和成功接龙的成语,都会显示在作品的接龙记录里,便于使用者学习和记忆。通过积分的方式,能激励用户开动脑筋,努力完成接龙。本作品极具智能和体贴性,如......
  • 汪子熙趣味接龙游戏实现里原创部分的亮点
    本作品使用Kitten编程猫这个具有国内自主知识产权的工具开发而成,工程里每一个积木的使用都是作者和原创。最值得一提的原创部分罗列如下:使用列表的数据结构来存储将近2......
  • 汪子熙趣味接龙游戏实现的参考资源
    参考资源(参考或引用他人资源及出处)本作品未引用或者复制其他kitten作品的工程文件或者源代码,只参考了Kitten编程猫源码编辑工具自带的帮助文档。该文档的入口:在编辑器右......