滑雪问题(动规)
本文:题意+思路+代码+坑+测试数据
题意:给A行B列的数代表每块地的高度,需要从高到低滑,找最长距离
思路:
- 将每块地按高度从小到大排序
- 从最低到最高点:
最低处: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;
}
说说我自己做题时遇到的坑:
- 因为排序用的sort函数,没考虑相等的情况,题目中必须从高到低–>在转移方程前同时要判断全面
is_together(S[i],S[j])&&S[i].height>S[j].height - 在输入数组计算对应坐标时,要考虑最后一列的特殊性
- 再就是输入时为先行后列,自己判断时不要弄反
小白就因为弄反了一直发现不了错误所在。。。
最后给大家一些测试数据,自己发现以下你的错误吧!
小白就苦于没有测试数据自己琢磨哎。。。
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
一起加油~
觉得有帮助记得点个赞哦!
我现在一个赞都没有呜呜呜呜呜呜