两道dp
链接:https://ac.nowcoder.com/acm/contest/186/C?&headNav=www
来源:牛客网
终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)
题解:直接dp
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[];
int dp[][];
int main(){
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
memset(dp,-,sizeof(dp));
for(int i=;i<=n;i++)dp[i][]=;
for(int i=;i<=n;i++){
for(int j=;j<=;j++){
dp[i][j]=dp[i-][j];
if(dp[i-][j-a[i]]!=-)dp[i][j]=max(dp[i-][j-a[i]]+a[i],dp[i][j]);
if(dp[i-][j+a[i]]!=-)dp[i][j]=max(dp[i-][j+a[i]]+a[i],dp[i][j]);
}
}
int ans=;
for(int i=;i<=n;i++)
for(int j=-m;j<=+m;j++){
ans=max(ans,dp[i][j]);
}
cout<<ans<<endl;
return ;
}
http://www.hrbuacm.top/problem.php?id=5328
来源:东北四省赛
题意:给n张牌,总体力w,每张牌需要花费wi造成xi的伤害,同时每张牌可能会有两个属性,第一个属性可以在使用时使所有具有第二种属性的牌的w减1,计算最大伤害
样例输入
3 3
3 3 1 1
2 3 1 1
1 3 1 1
样例输出
9
思路:贪心+dp
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<bitset>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=;
int dp[maxn][maxn],ak[maxn];
struct pot{
int a;
int b;
int c;
int d;
}p[maxn];
bool cmp(struct pot aa,struct pot bb){
if(aa.d==bb.d){
if(aa.c==bb.c)
return aa.a<bb.a;
else return aa.c>bb.c;
}
return aa.d<bb.d;
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n,w;
cin>>n>>w;
for(int i=;i<=n;i++){
cin>>p[i].a>>p[i].b>>p[i].c>>p[i].d;
}
int ans=;
sort(p+,p++n,cmp);
memset(dp,-,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++){ak[i]=ak[i-]+(p[i].c);}
for(int i=;i<=n;i++){
for(int j=i;j>=;j--){
for(int k=w;k>=;k--){
if(p[i].c){
int xx=max(,p[i].a-j+);
if(k>=xx&&p[i].d&&j&&dp[j-][k-xx]!=-){
dp[j][k]=max(dp[j][k],dp[j-][k-xx]+p[i].b);
}
else if(k>=p[i].a&&j&&dp[j-][k-p[i].a]!=-)dp[j][k]=max(dp[j][k],dp[j-][k-p[i].a]+p[i].b);
}
else{
int xx=max(,p[i].a-j);
if(k>=xx&&p[i].d&&dp[j][k-xx]!=-){
dp[j][k]=max(dp[j][k],dp[j][k-xx]+p[i].b);
}
else if(k>=p[i].a&&dp[j][k-p[i].a]!=-)dp[j][k]=max(dp[j][k],dp[j][k-p[i].a]+p[i].b);
}
ans=max(ans,dp[j][k]);
}
}
}
cout<<ans<<endl;
return ;
}
(注意dp初始化为-1然后设置边界条件为0可以避免出现不存在情况继续向下更新的情况从而避免得到错误结果
两道dp的更多相关文章
- 两道DP,四年修一次路
第十一届:山区修路 题目描述 SNJ位于HB省西部一片群峰耸立的高大山地,横亘于A江.B水之间,方圆数千平方公里,相传上古的神医在此搭架上山采药而得名.景区山峰均在海拔3000米以上,堪称" ...
- 三十道DP练习(持续更新)(pw:DP)
前言: 话说DP这种纯考思维的题目,总是让我很伤脑筋,一些特别简单的DP我都常常做不出来,所以革命从现在(2018-05-01)开始,努力多刷点DP的练习-. 1.顺序对齐(align) 时间:201 ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- FJOI2020 的两道组合计数题
最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...
- ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)
两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...
- ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)
两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
- ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)
两道较为典型的单源最短路径问题,采用dijkstra解法 本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇). ZOJ1053(POJ ...
- 两道二分coming~
第一道:poj 1905Expanding Rods 题意:两道墙(距离L)之间架一根棒子,棒子受热会变长,弯曲,长度变化满足公式( s=(1+n*C)*L),求的是弯曲的高度h. 首先来看这个图: ...
随机推荐
- javascript void函数
<a href="javascript:doTest2();void(0);">here</a> 但这儿的void(0)究竟是何含义呢? Javascrip ...
- POJ 3436 ACM Computer Factory 最大流,拆点 难度:1
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...
- opencv3.0+vs2013安装记录
为了能够更好的学习图像,我觉得opencv是一个必不可少的库,因此在以后的研究上使用opencv作为研究工具,与大家共同进步. 话归正题:先搭建opencv的环境. 1.下载安装包3.0 a,官网打开 ...
- Cracking The Coding Interview2.4
删除前面的linklist,使用node来表示链表 // You have two numbers represented by a linked list, where each node cont ...
- 深入理解java虚拟机---jdk8新特性(二)
1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化
- 1085 PAT单位排行
每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤10^5),即考生人数.随后 N 行,每行按下列格式给出一个考 ...
- Java基础-语法定义
Java三个体系 Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Ja ...
- MVC扩展之HtmlHelper辅助方法
1.什么是HtmlHelper辅助方法?其实就是HtmlHelper类的扩展方法,如下所示: namespace System.Web.Mvc.Html { public static class F ...
- <Java><类与对象><OOP>
Overview 类 封装(encapsulation): 也称为数据隐藏.从形式上看,是将数据与行为组合起来,并对对象的使用者隐藏了数据的实现方式.封装给对象赋予了黑盒特征,提高重用性和可靠性. 继 ...
- oracle sql developer登录
1 登录Oracle SQL developer 时候要选择数据库连接,这里要区分cdb用户和pdb用户,cdb用户可以在cdb和pdb服务下登录,而pdb用户只能在pdb服务里面登录.比如sys用户 ...