题意:要连出一个从1-L的过山车线,给出n段可选的建设方案。每段都有起始位置,终止位置,代价,和乐趣程度。要实现1-L的长度中,相邻两端要首尾相连,总建设代价控制在B之内,问最多能获得多少乐趣程度。

解题思路:这里有两个限制条件,L和B,最开始的思维可能是dp[i][j][k]表示前i段,修的长度为j,花费为k的最大价值。但根据数据量,这样肯定会超时。这里同样有一个条件要仔细挖掘,相邻两端要首尾相连,所以对应长度为L,肯定要有一个段它的其实位置等于L,这样我们就可以把每一段的首地址用哈希存起来,到时候枚举到L就直接从哈希里面拿出来,这样就会少了枚举所有段的一层循环。dp[i][j]表示修的长度为i,花费为j的最大价值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int maxn = 10005;
struct Node
{int start,end,len,cost,fun;
}roller[maxn];
struct HashNode
{int id,next;
}HNode[maxn];
int L,N,B,dp[1005][1005]; //dp[i][j]表示修建的长度为i,花费为j的最大值
int h[maxn],cnt;bool cmp(Node a,Node b)
{if(a.start == b.start) return a.end < b.end;return a.start < b.start;
}void add(int len,int id)
{HNode[cnt].id = id, HNode[cnt].next = h[len];h[len] = cnt++;
}int main()
{while(scanf("%d%d%d",&L,&N,&B)!=EOF){memset(h,-1,sizeof(h));memset(dp,-1,sizeof(dp));for(int i = 1; i <= N; i++){scanf("%d%d%d%d",&roller[i].start,&roller[i].len,&roller[i].fun,&roller[i].cost);roller[i].end = roller[i].start + roller[i].len;}dp[0][0] = 0;for(int i = 1; i <= N; i++)add(roller[i].start,i);   //加入哈希节点for(int i = 0; i <= L; i++)for(int j = 0; j <= B; j++){if(dp[i][j] == -1) continue;int t = h[i];while(t != -1){if(roller[HNode[t].id].cost + j <= B)dp[roller[HNode[t].id].end][j + roller[HNode[t].id].cost] = max(dp[roller[HNode[t].id].end][j+roller[HNode[t].id].cost],dp[i][j]+roller[HNode[t].id].fun);t = HNode[t].next;}}int ans = -1;for(int i = 0; i <= B; i++)ans = max(ans,dp[L][i]);printf("%d\n",ans);}return 0;
}

poj 3257(哈希+二维dp)相关推荐

  1. 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理

    problem Dec Accepts: 1284 Submissions: 4572 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  2. Efficient Exchange DP 二维DP

    YouhaverecentlyacquiredanewjobattheBankforAcquiring Peculiar Currencies. Here people can make paymen ...

  3. CDOJ 1347柱爷的矩阵(二维dp)

    柱爷的矩阵 Time Limit: 125/125MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Stat ...

  4. P2380 狗哥采矿 (二维dp)

    原题链接:狗哥采矿 - 洛谷 思路:我一开始想的是,一个点往左走还是往上走与 它上面和左边的点走的方向有关系,但是感觉复杂交错.....然后看到了大佬的二维dp,其实Aij往左走,就让它左边的这一条都 ...

  5. P1719 最大加权矩形(二维dp)

    P1719 最大加权矩形(二维dp) 原题戳这里 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑 ...

  6. HDU-1493 QQpet exploratory park(概率+二维dp)

    第一次做dp 题目 扔骰子,给出扔出每个点的概率,求出到达特定点的概率是多少..这里所有特定点的和并不是100%,每个特定点的计算是将每一次(共十次)经过它的概率都加起来求和.得到100%的情况是将每 ...

  7. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  8. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】

    2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 2010  Solved: 1260 [Submit][Sta ...

  9. 【CF869E】The Untended Antiquity(哈希+二维树状数组)

    当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 ...

最新文章

  1. Android强制设置横屏或竖屏
  2. 网站推广——企业网站如何在网站推广中获取用户信任感?
  3. iOS15实现音乐播放器
  4. ETH突破620美元关口 日内涨幅为5.36%
  5. Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
  6. JavaScript 常见安全漏洞和自动化检测技术
  7. Openstack基础八大核心组件
  8. EditText光标始终保持在文字末尾
  9. 一些Shell经典脚本
  10. Error attempting to get column 'state' from result set
  11. ROS——UDRF机器人模型优化(xacro)
  12. 证件照制作小程序源码下载-超级实用工具
  13. 使用kali对同一局域网内的设备进行断网和查看设备图片
  14. word中项目符号自动变小_HTML和Word中的项目符号点类型和创建
  15. 电脑唯独搜不到自己的wifi信号,怎么办
  16. 【2013-10-3前】Win7-C盘空间瘦身
  17. 我的2012,一个2b青年的表白
  18. Netty源码剖析之内存池和对象池设计流程
  19. HTML hr标签简介
  20. 年龄估计系列(2)年龄检测数据库

热门文章

  1. Java编写抓取用户信息代码_[代码全屏查看]-一个基于JAVA的知乎爬虫,抓取知乎用户基本信息...
  2. 神策数据如何助力36氪实现数据运营?
  3. python 中的queue, deque
  4. 分享一些书籍,方方面面,很多值得一读
  5. 在IIS7上部署aspx网站
  6. mysql压力测试工具Mysqlslap
  7. 百度搜索,你画了好大一张饼,你还打算欺骗多少人呢?有图为证
  8. 数据战略和风险管理系统
  9. search string iteration
  10. shanghai hongqiao railway station