您的位置:首页 > 其它

[POJ_1088]滑雪

2011-08-23 10:56 246 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: