HDU 6447 YJJ's Salesman (dp+树状数组+莫干山算法)
题意:一个 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+树状数组+莫干山算法)相关推荐
- HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)
HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...
- HDU 6447 YJJ's Salesman(线段树+DP)
YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
- 树形DP+树状数组 HDU 5877 Weak Pair
1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...
- hdu 6447YJJ's Salesman 离散化+树状数组+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 因为图中点的坐标值过大,达到1e9.然而只有1e5个点.所以先将其离散化.并按照<x.y& ...
- HDU 2836 Traversal 简单DP + 树状数组
题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...
- 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)走到( ...
- HDU 4455 Substrings(dp+树状数组优化)
题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...
- 小魂和他的数列(dp+树状数组优化)
链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...
- HDU 5792 World is Exploding(树状数组+离散化)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5792 题意: 思路: lmin[i]:表示左边比第i个数小的个数. lmax[i]:表示左边比第i个 ...
最新文章
- python mean函数_聚类算法 Mean-shift
- Boost之timer库
- vs中没有fstream_vs++2010 编译说找不到 fstream.h 解决方法
- geth bootnodes
- 如何实现一个教师与学生教学辅助平台?
- Sql 实现自动添加行数标记
- 启动NameNode和DataNode
- MYSQL禁用与启用事件
- pr获取无字幕视频素材和常用素材的网站
- 第一次参加公司研发部门高级别会议之感
- 微计算机的工作原理,一文看懂微流控芯片的工作原理
- 哪个数据库替代oracle,关于Oracle数据库替代加密算法
- 性能测试监控TP50、TP99、TP999含义
- html语言开关控制灯泡,用js控制电灯开关
- 如何爬取微信公众号的所有文章
- How to make a Speech Machine
- MySQL数据库教程天花板,mysql安装到mysql高级,强|硬 宋红康版
- UE4 Socket多线程非阻塞通信【1】
- java 框架GAT_GAT2.0使用文档(组合接口测试)
- 数据赋能--数字化转型价值起点