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;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值