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],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
随机推荐
- 关于sqfa
有的时候定义状态,下次来到这个状态的时候,不应该就否决掉下次,因为下次的权值可能比这次更优..
- Thinkphp join 连接查询
public function test ( ) { $User = M('authlist'); $rs = $User->join('left join wifi_shop on wifi_ ...
- Factorial Solved Problem code: FCTRL
import sys #import psyco #很奇怪,这题用psyco就runtime error #psyco.full() def z(n): #这个应该是技巧的一种算法 r = 0 whi ...
- Python学习笔记总结(四)异常处理
1.基础 try/except/else:[else是可选的]捕捉由代码中的异常并恢复,匹配except里面的错误,并执行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常 ...
- fgets和scanf的区别
fgets和scanf的区别 1.测试使用scanf的一个例子: #include "stdio.h" #include "string.h" int main ...
- mysql 查询表
判断表是否存在 SELECT table_name FROM information_schema.TABLES WHERE table_name ='yourname'; 判断存储过程是否存在 se ...
- ios打包ipa的四种实用方法(.app转.ipa)-备
感谢大神分享这个博客 总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Arc ...
- java I/O之装饰者模式
装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...
- .net中除去IList中的多余项
IList<ActionInfo> tempList = new List<ActionInfo>(); IList<ActionInfo> tempActionL ...
- IT人大学生活之“做点正经事”
最近一直主抓部门的人事招聘工作:很多到手的简历,特别是毕业一年之内的同学的简历上面都会写到:在xxx餐饮公司实习,获得了与人交流的经验:在学生会组织了哪些文体活动:在大四参加了一些与软件开发不相关的一 ...