您的位置:首页 > 其它

动态规划1-滑雪(算法基础 第4周)

2016-06-09 00:48 387 查看
问题描述:





讲解:





代码写的太乱了,,,,(今天帮老师搬家,干了一天体力活,难受,,,)

源码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

struct POSE {
int i, j;
int high;
POSE() {
i=0;j=0;high=0;
}
};

bool operator < (const POSE& p1, const POSE& p2) {
return p1.high<p2.high;
}

int main() {
POSE a[101*101];
int high[101][101];
int length[101][101];
int row=0, col=0;
cin >> row >> col;

int t=0;
for (int i=1; i<=row; i++)
for (int j=1; j<=col; j++){
a[t].i = i;
a[t].j = j;
cin >> a[t].high;
high[i][j] = a[t].high;
length[i][j] = 1;
t++;
}

sort(a, a+row*col);
//"人人为我"式递推
for (int k=0; k<row*col; k++)
{
int i=a[k].i;
int j=a[k].j;
int h=a[k].high;
vector<int> len;
if (i>1 && high[i-1][j]<h){
len.push_back(length[i-1][j]);
}
if (i<row && high[i+1][j]<h){
len.push_back(length[i+1][j]);
}
if (j>1 && high[i][j-1]<h){
len.push_back(length[i][j-1]);
}
if (j<col && high[i][j+1]<h){
len.push_back(length[i][j+1]);
}
if (!len.empty()){
sort(len.begin(), len.end());
length[i][j]=len.at(len.size()-1)+1;
}
}
/**********************************************
//"我为人人"式递推
for (int k=0; k<row*col; k++)
{
int i=a[k].i;
int j=a[k].j;
int h=a[k].high;
if (i>1 && high[i-1][j]>h){
length[i-1][j]=max(length[i-1][j], length[i][j]+1);
}
if (i<row && high[i+1][j]>h){
length[i+1][j]=max(length[i+1][j], length[i][j]+1);
}
if (j>1 && high[i][j-1]>h){
length[i][j-1]=max(length[i][j-1], length[i][j]+1);
}
if (j<col && high[i][j+1]>h){
length[i][j+1]=max(length[i][j+1], length[i][j]+1);
}
}
************************************************************/
int maxstep=1;
for (int i=1; i<=row; i++){
for (int j=1; j<=col; j++){
if (length[i][j]>maxstep){
maxstep = length[i][j];
}
}
}
cout << maxstep << endl;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划