HDU 6447 YJJ's Salesman 【离散化+树状数组求区间最大】

news/2024/11/30 3:24:27/


传送门:HDU 6447


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

Problem Description
YJJ is a salesman who has traveled through western country. YJJ is always on journey. Either is he at the destination, or on the way to destination.
One day, he is going to travel from city A to southeastern city B. Let us assume that A is (0,0) on the rectangle map and B (109,109). YJJ is so busy so he never turn back or go twice the same way, he will only move to east, south or southeast, which means, if YJJ is at (x,y) now (0≤x≤109,0≤y≤109), he will only forward to (x+1,y), (x,y+1) or (x+1,y+1).
On the rectangle map from (0,0) to (109,109), there are several villages scattering on the map. Villagers will do business deals with salesmen from northwestern, but not northern or western. In mathematical language, this means when there is a village k on (xk,yk) (1≤xk≤109,1≤yk≤109), only the one who was from (xk−1,yk−1) to (xk,yk) will be able to earn vk dollars.(YJJ may get different number of dollars from different village.)
YJJ has no time to plan the path, can you help him to find maximum of dollars YJJ can get.

Input
The first line of the input contains an integer T (1≤T≤10),which is the number of test cases.
In each case, the first line of the input contains an integer N (1≤N≤105).The following N lines, the k-th line contains 3 integers, xk,yk,vk (0≤vk≤103), which indicate that there is a village on (xk,yk) and he can get vk dollars in that village.
The positions of each village is distinct.

Output
The maximum of dollars YJJ can get.

Sample Input
1
3
1 1 1
1 2 2
3 3 1

Sample Output
3



题意:
商人从(0,0)走到(109,109)途中有若干村庄,商人可以向(x,y+1)(x+1, y) (x+1, y+1)三个方向前进,当向(x+1,y+1)方向前进时有一个村庄,那么就可以获得村庄(x+1, y+1)的利润,问商人途中最多可以挣多少钱。


题解:

题意很好理解,在109 * 109 的二维矩阵中,对我们有用的只要n个村庄的坐标,其余点对最终结果没有贡献,所以我就想到了离散化这些点,按照题目要求,离散化后我们最多变成一个 105 * 105 的二维矩阵。
一开始我想用dp来做,但是105 * 105 的二维dp一定超时,那么就得降维
变成: d p [ i ] = m a x ( d p [ k ] ) + v [ i ] [ j ] dp[i]=max(dp[k])+v[i][j] dp[i]=max(dp[k])+v[i][j](1<k<i)。

降维的思想有点像01背包降维的思想。

我们将n个村庄离散化,并且按 y 有小到大排序,如果 y 相等就按 x 由大到小排序
s u m [ i ] sum[i] sum[i] 表示前 i 行的最大利润。

为什么要这么排序呢?因为我们一列一列的操作,每次找第一个大于等于这个村庄x的位置,求在他之前的行的最大值。
y 由小到大排序保证了我们每次求的时候,sum都是 y - 1 的最大值;x 由大到小排序是保证每次算完更新的时候,不会影响小于当前x的值的计算,都是 x - 1的量,具体可以看代码理解

用树状数组来解决区间最大值的问题。



AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=110000;
int t,n;
struct Node
{int x,y,v;
}a[N];
bool cmp(Node a,Node b)
{if(a.y==b.y) return a.x>b.x;return a.y<b.y;
}
int x[N];
ll sum[N];
int lowbit(int x)
{return x&(-x);
}
void update(int x,ll k)//更新
{while(x<=n)//往后更新{sum[x]=max(sum[x],k);x+=lowbit(x);}
}
ll query(int x)//求前x行最大利润
{ll ans=0;for(int i=x;i>0;i-=lowbit(i)){ans=max(ans,sum[i]);}return ans;
}
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);x[i]=a[i].x;sum[i]=0;}sort(a+1,a+1+n,cmp);sort(x+1,x+1+n);ll ans=0;for(int i=1;i<=n;i++){int k=lower_bound(x+1,x+1+n,a[i].x)-x;//找第一个大于等于x的位置ll tmp=a[i].v+query(k-1);update(k,tmp);//如果x有小到大排序就会影响前面的值ans=max(ans,tmp);}printf("%I64d\n",ans);}return 0;
}

http://www.ppmy.cn/news/682503.html

相关文章

有关《家》的经典歌曲_【经典】50首诗词,做成50首歌曲,够你享受一整年!(收藏了慢慢听)...

原标题&#xff1a;【经典】50首诗词&#xff0c;做成50首歌曲&#xff0c;够你享受一整年&#xff01;(收藏了慢慢听) 一边痛饮一边唱着《将进酒》&#xff0c;该有多潇洒&#xff0c;当《关雎》化成歌声&#xff0c;是何等缱绻缠绵&#xff0c;当《送别》用现代歌曲唱出来&am…

古文诗词赋

古文诗词 人心惟危&#xff0c;道心惟微&#xff1b;惟精惟一&#xff0c;允执厥中。天行健&#xff0c;君子以自强不息。地势坤&#xff0c;君子以厚德载物。为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。一、古文 滕王阁序 滕王阁…

硬件基本常识杂记1

文章目录 电感&#xff08;RL电路&#xff09;&#xff0c;电容&#xff08;RC电路&#xff09;&#xff0c;(LRC电路)谐振&#xff08;串联、并联&#xff09;滤波器&#xff08;高通RC、低通RC、高通RL、低通RL、带通、Π型&#xff09;积分电路、微分电路截至频率w信号传输、…

清华大学计算机夏文韬,太猛了--南京外国语学校2007届高三毕业生去向

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 南京外国语学校2007届高三毕业生去向 清华大学(15人) 黄声希、许多多、姜 楠、欧阳云、陈燕然、刘硕瑶、顾益玮、冯翔欣、刘 畅、刘雨霏、马 君、金 璐、周 逸、 陶雨洁、(陈莉茜) 北京大学(10人) 范心露、王靖、徐叶、韩锋…

数学计算机学具制作,神奇的数学

神奇的数学 神奇的数学1 好玩的数学&#xff0c; 加减乘除的运用&#xff0c; 就像奇妙的游戏&#xff0c; 带来无穷的乐趣&#xff0c; 数学真好玩。 奇妙的数学&#xff0c; 就像头脑一样&#xff0c; 知识永无止境&#xff0c; 有着魔力般的吸引力&#xff0c; 让人想成长。…

试论开源生态的经济模型

| 作者&#xff1a;庄表伟 | 编辑&#xff1a;金心悦 | 设计&#xff1a;朱亿钦 | 责编&#xff1a;王玥敏 缘起这是一个我一直想写&#xff0c;却一直没有想得非常清楚的课题。目标非常清楚&#xff1a;通过创建一种经济模型&#xff0c;来分析开源生态中的各种问题。上一次在…

犹太人成功和浪漫的秘诀(.html)

目录 1 心悦卿兮 2 代码实现&#xff08;.html&#xff09; 3 犹太人的成功秘诀——《塔木德》 3 投资于比金钱更有价值的时间 1 心悦卿兮 视频&#xff1a; 美好的结局 2 代码实现&#xff08;.html&#xff09; <!DOCTYPE html> <html> <head><…

郑州大学计算机专业本科毕业去向,河南6所高校毕业生月薪公布 :河大最高 郑大垫底...

最近,省内多所高校陆续发布了2015届毕业生就业质量报告。 什么专业好就业?哪些专业工资高?小编查阅了郑大、河大、河南农大、河师大、河南理工大学和河南财经政法大学等省内6所高校的就业质量报告,发现本科生的整体就业率多在90%以上(多高于研究生),平均薪酬多在3400元-39…