题意:给你n对pair 里面有两个值,分别是key 和 val 。你可以取相邻的两个pair 获得其中的val,前提是两个pair 的key 的 gcd 不为 1。当然你把相邻的两个取走了之后原本不相邻的两个就变得相邻了。比如:你将下标为 2,3 取走之后,下标1,4就变得相邻了,求你可以获得的最大val。

题解:典型的合并问题,应该能想到用区间dp,但这里得考虑清楚,状态怎么转移。我们定义dp[i][j]为i~j能够获取的最大值。那么怎么更新状态呢,我们用一个前缀和去维护val,如果

dp[i+1][j-1]能够取完,其值一定为sum[j-1]-sum[i]。如果当前的区间i,j互质,那么i~j都可以取完。否则我们就要考虑剩下哪些val能够使最终的结果最大,这里就用for循环去跑一遍,枚举中间值k,看剩下哪些值是最优解。

(对区间dp的构造有了更深的理解 过几天可以写一篇小结了)。

ac代码:

    #include <cstdio>
#include <iostream>
#include <cstring>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
ll key[];
ll v[];
ll dp[][];
ll sum[];
ll gcd(ll a,ll b)
{
if(b==) return a;
return gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
mt(dp);
mt(sum);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&key[i]);
}
for(int i=;i<=n;i++)
{
scanf("%lld",&v[i]);
sum[i]=sum[i-]+v[i];
}
for(int l=;l<=n;l++)
{
for(int i=;i+l-<=n;i++)
{
int j=i+l-;
if(dp[i+][j-]==(sum[j-]-sum[i]) && gcd(key[i],key[j])!=)
{
dp[i][j]=sum[j]-sum[i-];
continue;
}
for(int k=i;k<j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]);
}
}
//
printf("%lld\n",dp[][n]);
}
}

hdu 5900 区间dp的更多相关文章

  1. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  2. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  4. HDU 4293---Groups(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4293 Problem Description After the regional con ...

  5. String painter HDU - 2476 -区间DP

    HDU - 2476 思路:分解问题,先考虑从一个空串染色成 B串的最小花费 ,区间DP可以解决这个问题 具体的就是,当 str [ l ] = = str [ r ]时 dp [ L ] [ R ] ...

  6. HDU 4632 区间DP 取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4632 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字 ...

  7. HDU 4570(区间dp)

    E - Multi-bit Trie Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  8. hdu 2476 区间dp

    题意: 给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2 例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10 先将0~10刷一次,变成aaaaaaaaaaa 1~ ...

  9. hdu 4632(区间dp)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

随机推荐

  1. Linux 安装软件报错 Sub-process /usr/bin/dpkg returned an error code (1)

    Linux 通过 apt-get 安装软件时报错,换一个软件安装也一样. Errors were encountered while processing: blueman E: Sub-proces ...

  2. js中的一些隐式转换和总结

    js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...

  3. [mcI18N]mcI18N项目简介

    mcI18N项目全称为我的世界模组本地化工具链项目(Minecraft Mod Localization Toolchain Project),是一个为我的世界模组本地化过程提供工具/平台支持的项目. ...

  4. 配置 Ubuntu 服务器

    Python: apt install python3-pip sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update ap ...

  5. VMware Workstation虚拟机打开系统时,提示“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件。是否在安装 VMware Workstation 后重新引导?”

    VMware Workstation虚拟机打开系统时,提示“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件.是否在安装 VMware Workstation 后重新引导? ...

  6. RabbitMQ and batch processing 批提交

    RabbitMQ - RabbitMQ and batch processinghttp://rabbitmq.1065348.n5.nabble.com/RabbitMQ-and-batch-pro ...

  7. 如何交叉编译openssl库?

    1. 获取源码 wget https://www.openssl.org/source/openssl-1.0.2s.tar.gz 2. 解压源码 tar xvf openssl-1.0.2s.tar ...

  8. Android:Mstar Android8.0平台音量控制流程

    一.Speaker 音量.静音流程分析 java层音量设置首先调用到的是AudioManager.java中的方法,在这里有两种方法可以设置音量 setStreamVolume 和 adjustStr ...

  9. springBoot注解搜集

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  10. SpringMVC源码分析--HandlerMappings

    之前分析过SpringMVC中的DispatcherServlet,分析了SpringMVC处理请求的过程.但忽略了一些DispatcherServlet协助请求处理的组件,例如SpringMVC中的 ...