您的位置:首页 > 其它

UVA - 10285 Longest Run on a Snowboard

2015-03-16 20:13 337 查看
题目大意:(强势插入)在一块R * C的雪地上有个叫name名字的人滑雪, 每次可以从高的地方滑向低的地方, 现在要选一个地方开始滑雪, 要求可以滑动的距离最长, 输出最长值。

解题思路:可以说是DFS吧, 但是对于每个位置只遍历一次(强势插入), 然后记录最优解, 下次再遇到时可直接调用最优解。

#include <cstdio>
#include <algorithm>
using namespace std;
int H[10100];

int cmp (int a, int b) {
return H[a] < H[b];
}

int main () {
int T, R, C;
char name[50];
scanf("%d", &T);

while (T--) {
scanf("%s%d%d", name, &R, &C);
int cnt = R * C, p[10100], DP[10100] = {0};
for (int i = 0; i < cnt; p[i] = i, i++)
scanf("%d", &H[i]);
sort(p, p + cnt, cmp);

int ans = 0, Dir[4] = {-1, 1, -C, C};
for (int k = 0; k < cnt; k++)
for (int l = 0; l < 4; l++) {
int i = p[k], j = p[k] + Dir[l];
if (i < 0 || l == 0 && i % C == 0 || l == 1 && i % C == C - 1)
continue;
if (H[i] < H[j] && DP[i] >= DP[j]) {
DP[j] = DP[i] + 1;
ans = max(ans, DP[j]);
}
}

printf("%s: %d\n", name, ans + 1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: