HDU 5900 - QSC and Master [ DP ]
题意:
给n件物品,有key和value
每次可以把相邻的 GCD(key[i], key[i+1]) != 1 的两件物品,问移除的物品的总value最多是多少
key : 1 3 4 2 移除34以后12也相邻了,可以移除
分析:
先预处理出所有GCD[l][r], 意味 l <= i <= r的区域可以全部移除, 用记忆化搜索处理
然后 dp[i] 代表到 i 为止可以得到的最大value和
if (G[l][r]) dp[r] = max(dp[r], dp[l-1] + sum[r] - sum[l-1] )
以及用 dp[i] = max(dp[i], dp[i-1]) 向后保留最大值
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
const int MAXN = ;
int t, n;
LL dp[MAXN];
LL key[MAXN], v[MAXN], sum[MAXN];
int GCD[MAXN][MAXN];
LL gcd(LL a, LL b)
{
return b == ? a : gcd(b, a%b);
}
bool check(int l, int r)
{
if (l > r) return ;
if (GCD[l][r] != -) return GCD[l][r];
if (l == r) return GCD[l][r] = ;
if ((r-l)% == ) return GCD[l][r] = ;
if (l == r-) return GCD[l][r] = ( gcd(key[l], key[r]) != );
if (gcd(key[l], key[r]) != && check(l+, r-) ) return GCD[l][r] = ;
for (int i = l+; i < r-; i++)
{
if (check(l,i) && check(i+, r)) return GCD[l][r] = ;
}
return GCD[l][r] = ;
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%lld", &key[i]);
sum[] = ;
for (int i = ; i <= n; i++)
scanf("%lld", &v[i]) , sum[i] = sum[i-] + v[i];
memset(GCD, -, sizeof(GCD));
for (int i = ; i <= n; i++)
for (int j = i; j <= n; j++)
check(i, j);
memset(dp, , sizeof(dp));
for (int i = ; i <= n; i++)
{
for (int j = ; j <= i; j += )
{
int l = i - j + , r = i;
if (check(l, r))
dp[i] = max(dp[i], dp[l-] + sum[r] - sum[l-]);
}
dp[i] = max(dp[i], dp[i-]);
}
printf("%lld\n", dp[n]);
}
}
HDU 5900 - QSC and Master [ DP ]的更多相关文章
- HDU 5900 QSC and Master 区间DP
QSC and Master Problem Description Every school has some legends, Northeastern University is the s ...
- HDU 5900 QSC and Master (区间DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意:给出序列$A_{i}.key$和$A_{i}.value$,若当前相邻的两个数$A_{ ...
- HDU 5900 QSC and Master
题目链接:传送门 题目大意:长度为n的key数组与value数组,若相邻的key互斥,则可以删去这两个数同时获得对应的两 个value值,问最多能获得多少 题目思路:区间DP 闲谈: 这个题一开始没有 ...
- 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) ...
- HDU 5900
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016沈阳网络赛 QSC and Master
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- hdu 2829 Lawrence(斜率优化DP)
题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
随机推荐
- ionic开发ios app
注意必须是mac系统 1. 首先要安装node环境,Ionic的安装和后续的许多前端工具的安装都依赖于node的包管理器npm. nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即 ...
- [目录][Leetcode] Leetcode 题解索引
之前想边做题边写结题报告,发现有点力不从心,而且很多地方也是一知半解,现在重新做题,重新理解.这篇文章主要起一个目录的作用. 目前没有什么特定的顺序,基本都是看心情翻牌的,哈哈~ 我在Github上新 ...
- ECSTORE验证码优化
用ecstore的朋友应该知道,ecstore的验证码超级鸡肋. 特别是字母和数字混合,根本就看不懂写的是什么? 数字还好,但是字母就别提了.而且还小. 索性就把验证码换掉.研究一下发现,ecstor ...
- 用Ajax读取XML格式的数据
].firstChild.data);}catch(exception){ }}}}</script>
- Codeforces 573B Bear and Blocks
http://codeforces.com/problemset/problem/573/B 题目大意: 给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块. 思 ...
- poj1740 A New Stone Game
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆. 真是好♂题,代码不长就是好♂题. 首先考虑两堆相同的 ...
- windows批处理命令教程
批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令 ...
- ThrottleStop
ThrottleStop 我的要开这个软件,睿频才能开.不然一直工作在1.8Ghz下默认频率太低了开了这个速度才有提升
- (一)一个简单的Web服务器
万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送 ...
- 线性时间构造普吕弗(Prüfer)序列
tree -> sequence 首先预处理数组 deg[N], deg[i]表示编号为i的节点的度数,我们每次要删除的节点肯定是 满足deg[i]=1 的编号最小节点, 首先找到所有叶子并选出 ...