题意:一个 1e9*1e9的方格,从(0,0)走到(1e9,1e9),有个方格有价值,特殊的经过方格可获得价值,每次只能向右、下、右下走,只有右下走到方格的才能获得价值,问最大获得的价值是多少

官方题解:莫干山算法(逃

个人理解:

先把各个村庄离散化,然后按照从上到下,从右到左的顺序排序,以上下为主,左右为次,之后我们更新这个 f [ j ] ,由于每一列的最大值只能由上一行影响,所以更新的顺序应该是从上到下,从左向右,类似01背包的优化。我们遍历的时候直接从第一个村庄遍历到最后一个村庄,由于已经排好序,所以在遍历的过程中可实现自动换行遍历,用数状数组取得f [ j - 1 ]的值,更新f [ j ]。

ps:后来发现不离散化这题也能过,数据出了问题。

代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);using namespace std;typedef pair<int,int> pii;
const int maxn = 100000 + 7, inf = 0x3f3f3f3f ;
struct Node{int x,y,v;bool operator < (const Node& rhs) const {return x == rhs.x ? y > rhs.y : x < rhs.x;}
}nodes[maxn];
int c[maxn];
void add(int x,int val){while(x < maxn){c[x] = max(c[x],val);x += lowbit(x);}
}
int query(int x){int res = 0;while(x){res = max(res,c[x]);x -= lowbit(x);}return res;
}void Init(){mem(c,0),mem(nodes,0);
}int main() {//FRER();//FREW();int T;scanf("%d",&T);while(T--){Init();int n;scanf("%d",&n);int cnt1 = 0 , cnt2 = 0;for(int i=1;i<=n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);nodes[cnt2++] = {a,b,c};}sort(nodes,nodes+n);for(int i=0;i<n;i++){int val = query(nodes[i].y-1);add(nodes[i].y,val+nodes[i].v);}int res = query(n);cout<<res<<endl;}return 0;
}

HDU 6447 YJJ's Salesman (dp+树状数组+莫干山算法)相关推荐

  1. HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)

    HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...

  2. HDU 6447 YJJ's Salesman(线段树+DP)

    YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  3. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  4. hdu 6447YJJ's Salesman 离散化+树状数组+DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 因为图中点的坐标值过大,达到1e9.然而只有1e5个点.所以先将其离散化.并按照<x.y& ...

  5. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

  6. CCPC 2018网络预赛 hdu 6447 YJJ's Salesman

    [题目链接] 题目意思 T组案例,给一个n,下面n行,每行三个数字(x,y,v)表示点(x,y)处的值为v,只有当从(x-1,y-1)走到(x,y)时,才能获得点(x,y)的v值,求从(0,0)走到( ...

  7. HDU 4455 Substrings(dp+树状数组优化)

    题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...

  8. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  9. HDU 5792 World is Exploding(树状数组+离散化)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5792 题意: 思路: lmin[i]:表示左边比第i个数小的个数. lmax[i]:表示左边比第i个 ...

最新文章

  1. python mean函数_聚类算法 Mean-shift
  2. Boost之timer库
  3. vs中没有fstream_vs++2010 编译说找不到 fstream.h 解决方法
  4. geth bootnodes
  5. 如何实现一个教师与学生教学辅助平台?
  6. Sql 实现自动添加行数标记
  7. 启动NameNode和DataNode
  8. MYSQL禁用与启用事件
  9. pr获取无字幕视频素材和常用素材的网站
  10. 第一次参加公司研发部门高级别会议之感
  11. 微计算机的工作原理,一文看懂微流控芯片的工作原理
  12. 哪个数据库替代oracle,关于Oracle数据库替代加密算法
  13. 性能测试监控TP50、TP99、TP999含义
  14. html语言开关控制灯泡,用js控制电灯开关
  15. 如何爬取微信公众号的所有文章
  16. How to make a Speech Machine
  17. MySQL数据库教程天花板,mysql安装到mysql高级,强|硬 宋红康版
  18. UE4 Socket多线程非阻塞通信【1】
  19. java 框架GAT_GAT2.0使用文档(组合接口测试)
  20. 数据赋能--数字化转型价值起点

热门文章

  1. 随机梯度下降(SGD)与经典的梯度下降法的区别
  2. 微信小程序时间戳转换为日期
  3. 【arcgis 批量将属性表批量导出成excel】
  4. Windows打印机驱动开发
  5. 送给大一新生的一些话
  6. 修改计算机参数,缺氧参数怎么修改 游戏内参数修改方法解答
  7. 推荐一个免费下载简历模板的网站
  8. 阿里云ACA、ACP和ACE认证考试有什么区别?考生应该如何选择?-阿里云开发者社区
  9. latex-多个表格引用
  10. 嵌入式 贪食蛇小游戏