您的位置:首页 > 其它

POJ 1088 滑雪 (DP)

2017-08-02 10:37 423 查看
还是感叹别人的码写的真好!!以及没事别用C++,,真的比C慢很多。。。。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int n, m;
int map[1000][1000];
int ans[1000][1000];         //存储每一个点能滑到的最大距离

int dp(int i, int j) {      //局部最优解

if (ans[i][j] > 0)    //避免重复计算
return ans[i][j];

int maxn = 0;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int tempi, tempj;
for (int k = 0; k < 4; k++) {
tempi = i + dir[k][0];
tempj = j + dir[k][1];

if (tempi > 0 && tempi <= n && tempj > 0 && tempj <= m &&
map[tempi][tempj] < map[i][j]) {
maxn = max(maxn, dp(tempi, tempj));
}
}

return ans[i][j] = maxn + 1;
}

int main(void) {

while (~(scanf("%d%d", &n, &m))) {
int answer = 0;
memset(map, 0, sizeof(map));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
scanf("%d", &map[i][j]);
}

memset(ans, 0, sizeof(ans));
for (int i = 1; i <= n; i++) {   //遍历每一个点
for (int j = 1; j <= m; j++) {
ans[i][j] = dp(i, j);
answer = max(ans[i][j], answer);  //整体最优解
}
}

printf("%d\n", answer);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: