题目背景

此题为改编题,特别鸣谢倪星宇同学。

有一次,HKE和LJC在玩一个游戏。

题目描述

游戏的规则是这样的:LJC在纸上写下两个长度均为N的数列A和B,两个数列一一对应。HKE每次可以找两个相邻的数A[i]和A[i+1],如果它们两个不互质,HKE可以选择得到(B[i]+B[i+1])分,然后擦掉A和B位置上的第i,i+1个数,并把两个序列重新按顺序编号。当所有相邻的数互质时,游戏结束。

HKE想知道他最大得分是多少。

输入输出格式

输入格式:

第1 行一个整数N;

第2 行N 个整数,依次表示Ai;

第3 行N 个整数,依次表示Bi。

输出格式:

仅含一个整数,表示B 列被删去的可能最大和。

输入输出样例

输入样例#1: 复制

6
9 8 6 5 6 3
11 19 12 17 18 15
输出样例#1: 复制

64
//解释:擦去A[2],A[3]与A[5],A[6],得分为64

说明

对于30%的数据,N ≤ 20;

对于60%的数据,N ≤ 100;

对于80%的数据,N ≤ 500

对于100%的数据,N ≤ 800, 1 ≤ Ai, Bi ≤ 10^9。

题解:

  区间dp,设dp[i][j]表示i和j之间不一定要消完的最大收益,g[i][j]为i到j必须消完的收益,那么g[i][j]有两个转移,一个是枚举断点,g[i][j]=max(g[i][j],g[i][k]+g[k+1][j]);然后我们可以消去中间的,再消i和j,g[i][j]=max(g[i][j],c[i]+c[j]+g[i+1][j-1]);

  然后是dp[i][j],如果i和k可以消,那么我们把i~k之间的都消完,然后消k+1~j。 dp[l][r]=max(dp[l][r],c[l]+c[r]+g[l+1][r-1]);如果i,j可以消,那么可以先消i,j之间的,然后消i和j。dp[l][r]=max(dp[l][r],c[l]+c[r]+g[l+1][r-1]);

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define ll long long
#define MAXN 810
using namespace std;
int n;
ll a[MAXN],c[MAXN];
ll dp[MAXN][MAXN],b[MAXN][MAXN],g[MAXN][MAXN]; ll gcd(ll x,ll y){
if(y==) return x;
else return gcd(y,x%y);
} bool emt(int i,int j){
if(gcd(a[i],a[j])!=) return ;
return ;
} ll DP(int l,int r){
if(l==r) return ;
if(b[l][r]) return dp[l][r];
if(r==l+) return max((ll),g[l][r]);
b[l][r]=;
dp[l][r]=max((ll),DP(l+,r));
for(int k=l+;k<r;k++){
if(emt(l,k)){
if(k==l+) dp[l][r]=max(dp[l][r],c[l]+c[k]+DP(k+,r));
else dp[l][r]=max(dp[l][r],c[l]+c[k]+g[l+][k-]+DP(k+,r));
}
}
if(emt(l,r)) dp[l][r]=max(dp[l][r],c[l]+c[r]+g[l+][r-]);
return dp[l][r];
} int main(){
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int j=;j<=n;j++) cin>>c[j];
memset(g,-,sizeof(g));
for(int len=;len<=n;len++){
for(int i=;i+len-<=n;i++){
int j=i+len-;
if(j==i+){
if(emt(i,j)) g[i][j]=c[i]+c[j];
else g[i][j]=g[][];
}
else{
if(emt(i,j)) g[i][j]=max(g[i][j],c[i]+c[j]+g[i+][j-]);
for(int k=i+;k<j;k++) g[i][j]=max(g[i][j],g[i][k]+g[k+][j]);
}
}
}
printf("%lld",max(DP(,n),(ll)));
}

洛谷NOIp热身赛 T2123 数列游戏的更多相关文章

  1. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  2. 洛谷.2042.[NOI2005]维护数列(Splay)

    题目链接 2017.12.24 第一次写: 时间: 2316ms (1268ms) 空间: 19.42MB (19.5MB)(O2) 注:洛谷测的时间浮动比较大 /* 插入一段数:将这些数先单独建一棵 ...

  3. 洛谷 P2059 [JLOI2013]卡牌游戏(概率dp)

    题面 洛谷 题解 \(f[i][j]\)表示有i个人参与游戏,从庄家(即1)数j个人获胜的概率是多少 \(f[1][1] = 1\) 这样就可以不用讨论淘汰了哪些人和顺序 枚举选庄家选那张牌, 枚举下 ...

  4. 洛谷 大牛分站 P1000 超级玛丽游戏

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

  5. BZOJ3191或洛谷2059 [JLOI2013]卡牌游戏

    BZOJ原题链接 洛谷原题链接 我们可以倒着来\(DP\). 设\(f[i][j]\)表示剩余\(i\)个人,从庄家数起第\(j\)个人的胜率,设当前枚举到第\(k\)张牌,该情况下这一轮淘汰的位置为 ...

  6. 洛谷 P4819 [中山市选]杀人游戏

    洛谷 题目就是让我们在DAG中找到一些点,覆盖所有点. 因为是DAG,可以想到tarjan缩一下点.假设我们需要找x个点,那么答案就是(n-x)/n. 我们怎么选点呢? 敏锐的我们很快就能想到,直接选 ...

  7. 【洛谷】P1247取火柴游戏

    题目链接:https://www.luogu.org/problemnew/show/P1247 题意:nim取石子的题意,多了一个判断先手赢的话,输出先手第一把怎么拿,以及拿完之后每堆还剩多少. 题 ...

  8. 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)

    题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...

  9. 洛谷 P3781 - [SDOI2017]切树游戏(动态 DP+FWT)

    洛谷题面传送门 SDOI 2017 R2 D1 T3,nb tea %%% 讲个笑话,最近我在学动态 dp,wjz 在学 FWT,而我们刚好在同一天做到了这道题,而这道题刚好又是 FWT+动态 dp ...

随机推荐

  1. C#基础——事件初步

    事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ...

  2. 【LeetCode】435-无重叠区间

    题目描述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触", ...

  3. Microsoft Office 365的安装

    一.安装准备 本教程中需要用到的工具包括:最新版的Office离线包,虚拟光驱软件,离线Kms激活工具, 下载地址:百度网盘 链接: https://pan.baidu.com/s/1sQk7zE40 ...

  4. nginx部署成功却没有办法访问

    1.首要想到的问题是防火墙没关 注意:因为centos7.0默认不是使用iptables方式管理,而是firewalld方式.CentOS6.0防火墙用iptables管理. 2.解决: ①首先查看防 ...

  5. unittest核心要素

    1 TestCase 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程, 包括测试环境的准备(setUp),执行测试代码(run),以及测试后环境的还原(tearD ...

  6. Delphi - 调用外部程序并阻塞到外部程序中

    Delphi 调用外部程序并阻塞到外部程序中 背景说明: 前段时间开发一个数据转换的系统,业务逻辑中说明数据需要压缩成.tar.gz格式. 我在Windows系统下采用,先生成批处理文件,然后调用Wi ...

  7. StringBuilder和StringBuffer的区别

    Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...

  8. TestNG(一) TestNG实战在idea中创建module

    1.在ider里创建一个Module 2.直接点击下一步 3.输入Groupld h和Artifactid名称,点击下一步 4.点击Finish 创建完成

  9. Hadoop 之 深入探索MapReduce

    1.MapReduce基础概念 答:MapReduce作业时一种大规模数据的并行计算的便程模型.我们可以将HDFS中存储的海量数据,通过MapReduce作业进行计算,得到目标数据. 2.MapRed ...

  10. [scikit-learn] 特征二值化

    1.首先造一个测试数据集 #coding:utf-8 import numpy import pandas as pd from sklearn.preprocessing import OneHot ...