uva285 - Longest Run on a Snowboard(二维最长递增子序列)
2016-03-18 23:45
357 查看
题意:
给你一二维数组,求最长降序路径
思路:
直接4个方向分别找最长路径,dp[i][j]记录下map[i][j]这个点能找到的最长路径,最后再遍历,看哪个点为起点后能找到最长的路径。再备忘即可。
代码如下:
给你一二维数组,求最长降序路径
思路:
直接4个方向分别找最长路径,dp[i][j]记录下map[i][j]这个点能找到的最长路径,最后再遍历,看哪个点为起点后能找到最长的路径。再备忘即可。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; char name ; int map , dp ; const int dir[4][2] = { { 0, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 } }; int n, m; int DP(int i, int j) { if (dp[i][j] != -1) return dp[i][j]; dp[i][j] = 1; for (int k = 0; k < 4; k++) { int x = i + dir[k][0]; int y = j + dir[k][1]; if (x<1 || x>n || y<1 || y>m) continue; if (map[x][y] < map[i][j]) dp[i][j] = max(dp[i][j], DP(x, y) + 1); } return dp[i][j]; } int main() { int cas; scanf("%d", &cas); while (cas--) { scanf("%s",name); scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d", &map[i][j]); memset(dp, -1, sizeof(dp)); int maxn = 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) maxn = max(maxn, DP(i, j)); printf("%s: %d\n", name, maxn); } return 0; }
相关文章推荐
- 网易互娱2017实习生招聘在线笔试(一)
- 高精度进制转换
- Oracle 队列锁类型 Oracle Enqueue Lock Type Reference including 11g new locks
- 大数据第8天作业
- find命令学习
- Error inflating class android.widget.CheckBox
- Java day06 多态 (类型提升,向下转型)
- delphi 精要-读书笔记(内存分配释放)
- Android为CustomView在xml中设置属性
- linux服务器运维 -- 路线、架构
- 高精度GCD
- 驱动对象和设备对象的区别
- 【Web】写个HTML页面去调试HTTP接口方便些
- WorldWind源码剖析系列:WorldWind如何确定与视点相关的地形数据的LOD层级与范围
- r.js 配置文件 example.build.js 不完整注释
- spoj TSUM - Triple Sums fft+容斥
- Jpa实体VO使用继承的实体的做法@MappedSuperclass注解的使用
- enq: TX – row lock/index contention、allocate ITL等待事件
- POJ 3694 Network 边双连通分量
- 和为S的连续正数序列