设为首页 加入收藏

TOP

poj - 1088 - 滑雪(dp)
2015-07-20 17:34:01 来源: 作者: 【 】 浏览:1
Tags:poj 1088 滑雪

题意:一个R * C的矩阵(1 <= R,C <= 100),元素代表该点的高度h(0<=h<=10000),从任意点出发,每次只能走上、下、左、右,且将要到的高度要比原高度小,求最长路。

题目链接:http://poj.org/problem?id=1088

――>>设dp[i][j]表示从ij位置出发的最长路,则状态转移方程为:

dp[x][y] = max(dp[x][y], Dp(nNewX, nNewY) + 1);

时间复杂度:O(R * C)

#include 
  
   
#include 
   
     #include 
    
      using std::max; const int MAXN = 100 + 10; int R, C; int nHeight[MAXN][MAXN]; int dp[MAXN][MAXN]; int dx[] = {-1, 1, 0, 0}; int dy[] = { 0, 0, -1, 1}; void Read() { for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { scanf("%d", &nHeight[i][j]); } } } int Dp(int x, int y) { if (dp[x][y] != -1) { return dp[x][y]; } int& nRet = dp[x][y]; nRet = 1; for (int i = 0; i < 4; ++i) { int nNewX = x + dx[i]; int nNewY = y + dy[i]; if (nNewX >= 1 && nNewX <= R && nNewY >= 1 && nNewY <= C && nHeight[nNewX][nNewY] < nHeight[x][y]) { nRet = max(nRet, Dp(nNewX, nNewY) + 1); } } return nRet; } void Solve() { int nRet = 0; memset(dp, -1, sizeof(dp)); for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { if (dp[i][j] == -1) { Dp(i, j); } } } for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { if (dp[i][j] > nRet) { nRet = dp[i][j]; } } } printf("%d\n", nRet); } int main() { while (scanf("%d%d", &R, &C) == 2) { Read(); Solve(); } return 0; } 
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 1185 状压dp 好题 (当前状态.. 下一篇9-操作符重载

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)