POJ Problem 1088 滑雪

来源:互联网 发布:mac版软件下载大全 编辑:程序博客网 时间:2024/05/15 15:49

将高度从低到高排序,依次计算路径长度:

(1)对于最小的高度而言,由它结束的最长路径是1;

(2)对于任意一个高度而言,由它结束的路径最大长度是其周围(上、下、左、右)比它小的高度的最长路径值加1的最大值。如果周围没有比它小的,则其最大路径为1。

#include<iostream>#include<vector>#include<algorithm>using namespace std;struct Data{    int num, row, col;    bool operator<(const Data& rhs) const{        return num < rhs.num;    }};int main() {    int n, m;    cin >> n >> m;    vector<vector<int> > mat(n);    vector<Data> arr(n*m);    vector<vector<int> > len(n);    for(int i = 0; i < n; ++i){        mat[i].resize(m);        len[i].resize(m);        for(int j = 0; j < m; ++j){            cin >> mat[i][j];            arr[i*m+j].num = mat[i][j];            arr[i*m+j].row = i;            arr[i*m+j].col = j;            len[i][j] = 0;        }    }    sort(arr.begin(), arr.end());    int ans = 0;    for(int i = 0; i < n*m; ++i){        int a = arr[i].row;        int b = arr[i].col;        if(a-1 >= 0 && mat[a-1][b] < mat[a][b])            len[a][b] = max(len[a][b],len[a-1][b]+1);        if(b-1 >= 0 && mat[a][b-1] < mat[a][b])            len[a][b] = max(len[a][b],len[a][b-1]+1);        if(a+1 < n && mat[a+1][b] < mat[a][b])            len[a][b] = max(len[a][b],len[a+1][b]+1);        if(b+1 < m && mat[a][b+1] < mat[a][b])            len[a][b] = max(len[a][b],len[a][b+1]+1);        if(len[a][b] == 0)            len[a][b] = 1;        ans = max(ans, len[a][b]);    }    cout << ans << endl;}


0 0