NYOJ 195飞翔(动态规划)

描述

鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧。于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中。

这些鹰的起始点被设在一个N*M矩阵的左下角map[1,1]的左下角。终点被设定在矩阵的右上角map[N,M]的右上角,有些map[i,j]是可以从中间穿越的。每一个方格的边长都是100米。如图所示:

没有障碍,也没有死路。这样设计主要是为了高速飞行的鹰们不要发现死路来不及调整而发生意外。潘帕斯雄鹰冒着减RP的危险从比赛承办方戒备森严的基地中偷来了施工的地图。但是问题也随之而来,他必须在比赛开始之前把地图的每一条路都搞清楚,从中找到一条到达终点最近的路。(哈哈,笨鸟不先飞也要拿冠军)但是此鹰是前无古鹰,后无来鹰的吃菜长大的鹰--菜鸟。他自己没有办法得出最短的路径,于是紧急之下找到了学OI的你,希望找到你的帮助。

输入

本题有多组数据。以EOF为输入结束的标志。

每组测试数据的首行为n,m(0<n,m<=1000000),第2行为k(0<k<=1000)表示有多少个特殊的边。以下k行为两个数,i,j表示map[i,j]是可以直接穿越的。

输出

仅一行,1,1-->n,m的最短路径的长度,四舍五入保留到整数即可

样例输入

3 2

3

1 1

3 2

1 2

样例输出

383

这题其实认真看一下应该会发现是最长上升序列,这题类似与矩形嵌套那题,明白这个做起来就真的很简单了,所以这题算法上真的没得讲,关键你得看得出来是叫你求数对的最长上升序列,时间复杂度为O(k*k);最后稍微注意一下处理四舍五入

AC代码:

# include <cstdio>
# include <cstdlib>
# include <cstring>
# include <cmath>
# include <algorithm>
using namespace std;
struct seg{
	int x;
	int y;
};
seg s[1010];
int dp[1010];
int compare(seg a, seg b){
	if(a.x!=b.x){
		return a.x<b.x;
	}
	return a.y<b.y;
}
int main(){
	int n, m, k, i, j, Max;
	double ans;
	while(scanf("%d%d%d", &n, &m, &k)!=EOF){
		for(i=1; i<=k; i++){
			dp[i]=1;
		}
		Max=-1;
		dp[1]=1;
		for(i=1; i<=k; i++){
			scanf("%d%d", &s[i].x, &s[i].y);
		}
		sort(s+1, s+k+1, compare);
		for(i=2; i<=k; i++){
			for(j=1; j<i; j++){
				if(s[i].x>s[j].x&&s[i].y>s[j].y){
					dp[i]=max(dp[j]+1, dp[i]);
				}
			}
			Max=max(Max, dp[i]);
		}
		ans=(m+n-Max*2)*100+100.0*sqrt(2.0)*Max;
		int c=(int)(ans*10)-(int)ans*10;
		if(c<=4){
			printf("%d\n", (int)ans);
		}
		else{
			printf("%d\n", (int)ans+1);
		}
	}
	return 0;
}
时间: 2024-08-04 00:52:19

NYOJ 195飞翔(动态规划)的相关文章

nyoj 195 飞翔

飞翔 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中. 这些鹰的起始点被设在一个N*M矩阵的左下角map[1,1]的左下角.终点被设定在矩阵的右上角map[N,M]的右上角,有些map[i,j]是可以从中间穿越的.每一个方格的边长都是100米.如图所示: 没有障碍,也没有死路.这样设计主要是为了高速飞行的鹰们不要发现死

NYOJ 吃土豆(动态规划)

描述 Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect the qualities, but everyone must obey by t

nyoj 708 ones 动态规划

http://acm.nyist.net/JudgeOnline/problem.php?pid=708 状态转移方程的思路:对于一个数N,可以是N - 1的状态+1 得到,另外,也可以是(n / 2) * (1 + 1)得到,同理对于任意的奇数p,都有如果n可以整除p,都有f(n / p) + f(p) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

NYOJ 苹果【动态规划】

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~

滑雪 Time Limit: 1000MS                    Memory Limit: 65536k                                               http://poj.org/problem?id=1088            Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道

【动态规划】NYOJ195 飞翔

飞翔 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中. 这些鹰的起始点被设在一个N*M矩阵的左下角map[1,1]的左下角.终点被设定在矩阵的右上角map[N,M]的右上角,有些map[i,j]是可以从中间穿越的.每一个方格的边长都是100米.如图所示: 没有障碍,也没有死路.这样设计主要是为了高速飞行的鹰们不要发现死

nyoj 214-单调递增子序列(二) (演算法,PS:普通的动态规划要超时)

214-单调递增子序列(二) 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:11 submit:35 题目描述: 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度. 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5. 输入描述: 有多组测试数据(<=7) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表

nyoj 18 The Triangle 动态规划

和nyoj613(免费馅饼)一样的原理  从下 网上依次遍历 存贮最大值 #include <stdio.h> #include <algorithm> using namespace std; int main() { int n,num[105][105]={0}; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&n

NYOJ 16 矩形嵌套(动态规划)

时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测试数据的第