DP--百练1088滑雪(类似641div2--B)

滑雪问题(动规)

本文:题意+思路+代码+坑+测试数据

题意:给A行B列的数代表每块地的高度,需要从高到低滑,找最长距离
思路

  1. 将每块地按高度从小到大排序
  2. 从最低到最高点:
    最低处:DP=1,
    其他DP[i]=max(DP[i],DP[j]+1),j与i相连且低

首先struct构建地

#include<bits/stdc++.h>
using namespace std;
struct space{
	int x,y,height;
}; 

函数:用距离判断两块地是否相连

bool is_together(space A,space B){
	if(((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y))==1) return true;
	else return false;
}

排序用的函数

bool compare(space A,space B){
	return A.height<B.height;
}

main函数

int main()
{
	int a,b;		//最后一个点的坐标(a,b) a行数,b列数 
	cin>>a>>b;
	int num = a*b;
	space S[num+1];
	for(int i = 1;i <= num;i++){
		cin>>S[i].height;
		if(i%b==0) {
			S[i].y = b;
			S[i].x = i/b;
		}
		else {
			S[i].y = i%b;
			S[i].x = i/b+1;
		}
	}
	sort(S+1,S+num+1,compare);
	int DP[num+1];
	for(int i = 1;i <= num+1;i++){
		DP[i] = 1;
	}
	for(int i = 2;i <= num;i++){
		for(int j = 1;j < i;j++){
			//这里要特别注意:sort排序时没注意相等情况,这里不仅相连,更要往低处滑 
			if(is_together(S[i],S[j])&&S[i].height>S[j].height) DP[i] = max(DP[i],DP[j]+1);
		} 
	}
	sort(DP+1,DP+num+1);
	cout<<DP[num]<<endl;
	return 0;
}

说说我自己做题时遇到的坑:

  1. 因为排序用的sort函数,没考虑相等的情况,题目中必须从高到低–>在转移方程前同时要判断全面
    is_together(S[i],S[j])&&S[i].height>S[j].height
  2. 在输入数组计算对应坐标时,要考虑最后一列的特殊性
  3. 再就是输入时为先行后列,自己判断时不要弄反
    小白就因为弄反了一直发现不了错误所在。。。

最后给大家一些测试数据,自己发现以下你的错误吧!
小白就苦于没有测试数据自己琢磨哎。。。
1 3
2 3 3
得2

2 2
1 2
3 4
得3

8 8
39 48 49 38 47 46 45 59
28 22 39 38 49 44 31 10
27 48 49 38 51 52 35 10
26 26 26 38 26 26 26 26
26 26 26 38 26 26 26 26
24 45 58 38 56 55 38 13
23 44 43 38 41 40 39 14
22 22 39 38 49 44 31 10
得8

4 8
26 26 26 38 26 26 26 26
24 45 58 38 56 55 38 13
23 44 43 38 41 40 39 14
22 22 39 38 49 44 31 10
得6

一起加油~
觉得有帮助记得点个赞哦!
我现在一个赞都没有呜呜呜呜呜呜

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值