#include <iostream>
using namespace std;
int* data;
int* track;
int row, col, size;
int best_length = 0;
/*
void print_data(int* array)
{
for (int r=0; r<row; r++)
{
for (int c=0; c<col; c++)
{
int idx = r * col + c;
cout << array[idx] << " ";
}
cout << endl;
}
}
*/
int rc2i(int r, int c)
{
return r * col + c;
}
void i2rc(int i, int& r, int& c)
{
r = i / col;
c = i % col;
}
int get_best_length(int i)
{
// is it calculated before?
if (track[i] != -1)
return track[i];
int r = i / col;
int c = i % col;
int curr_best = 1;
if (c != 0)
{
int left = rc2i(r, c-1);
if (data[left] < data[i])
{
int len = get_best_length(left) + 1;
if (len > curr_best)
curr_best = len;
}
}
if (c != col-1)
{
int right = rc2i(r, c+1);
if (data[right] < data[i])
{
int len = get_best_length(right) + 1;
if (len > curr_best)
curr_best = len;
}
}
if (r != 0)
{
int up = rc2i(r-1, c);
if (data[up] < data[i])
{
int len = get_best_length(up) + 1;
if (len > curr_best)
curr_best = len;
}
}
if (r != row-1)
{
int bot = rc2i(r+1, c);
if (data[bot] < data[i])
{
int len = get_best_length(bot) + 1;
if (len > curr_best)
curr_best = len;
}
}
track[i] = curr_best;
return curr_best;
}
int main()
{
cin >> row >> col;
size = row * col;
data = new int[size];
track = new int[size];
for (int i=0; i<size; i++)
{
cin >> data[i];
track[i] = -1;
}
for (int i=0; i<size; i++)
{
int length = get_best_length(i);
if (best_length < length)
best_length = length;
}
cout << best_length;
delete[] data;
return 1;
}
[POJ_1088]滑雪
最新推荐文章于 2022-02-25 19:38:17 发布