The Legend of Zelda
Time Limit: 1000 msMemory Limit: 65536 KiB
Problem Description
Fish 真的非常喜欢打游戏,最近又沉迷于塞尔达传说,现在 Fish 刚刚打通了雷咒盖侬解放了神兽瓦·纳波利斯,准备前往死亡火山去挑战火咒盖侬。
现在 Fish 刚刚回到了格鲁德小镇上,我们知道死亡火山在地图的右上角,但是格鲁德小镇在地图的左下角,之间有非常远的距离,地图上会有不少的驿站用来休息,但是 Fish 不想为了路过驿站而走远路,现在 Fish 想安排一个旅行的路线,使得经过的驿站尽可能的多,请你编写一个程序帮助他!
抽象一下题意,在一个二维坐标轴上,现在给出起点终点和 N 个点 Pi 的坐标,选择尽可能多的点组成一个序列,使得序列中点的 x 和 y 坐标都是递增的。
Input
多组输入(不超过10组)
对于每组数据:
- 第一行包括四个数 x1,y1,x2,y2,分别代表起点的横纵坐标,终点的横纵坐标(x1 < x2, y1 < y2)
- 第二行输入一个整数 N,代表有 N 个点
- 接下来 N 行,每行输入一个点的坐标 xi,yi
0 <= N <= 1000
保证所有点的坐标大小在 32 位整数之内
Output
每组数据输出一行整数,为找出的最长序列长度(包含起点和终点)
Sample Input
1 1 9 9 5 0 8 3 2 3 3 4 3 7 1
Sample Output
4
Hint
第一组样例找出的最长序列只有 {(1, 1), (3, 2), (4, 3), (9, 9)} 长度为 4
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
}a[1000];
bool cmp(node a,node b)
{
if(a.x!=b.x)
{
return a.y<b.y;
}
return a.x<b.x;
}
int dp[1000];
int main()
{
int n,m,i,j,x,y,x1,x2,y1,y2,top;
while(cin>>x1>>y1>>x2>>y2)
{
cin>>n;
top=0;
for(i=0;i<n;i++)
{
cin>>x>>y;
if(x>x1&&y>y1&&x<x2&&y<y2)
{
a[top].x = x;
a[top++].y = y;
}
}
sort(a,a+top,cmp);
memset(dp,0,sizeof(dp));
int maxx = 1;
for(i=0;i<top;i++)
{
maxx = 1;
for(j=0;j<i;j++)
{
if(a[i].y>a[j].y&&a[i].x>a[j].x)
{
maxx = max(dp[j]+1,maxx);
}
}
dp[i] = maxx;
}
maxx = -1;
for(i=0;i<top;i++)
{
maxx = max(maxx,dp[i]);
}
cout<<maxx+2<<endl;
}
return 0;
}
本文介绍了一款塞尔达传说游戏中的路径规划问题。玩家需要从格鲁德小镇出发,前往死亡火山挑战火咒盖侬。通过算法帮助规划一条既能够经过尽可能多的驿站又保持坐标递增的路径。
1万+

被折叠的 条评论
为什么被折叠?



