POJ1088滑雪

来源:互联网 发布:啊d网络工具包教程 编辑:程序博客网 时间:2024/09/21 09:01

马上省赛了,还是刷水题的弱菜。。。

六级 + 省赛 + windows sdk + 数据结构(细+深度) + 操作系统(实现内存管理和文件操作等) 。。。

算了算,累死也很难完成了。

--------------------------------------------------------------------------------------------------------------------

滑雪这个题很早之前就做了。现在感觉现在的状态真的很适合学习了,所以重新开始学习,数据结构 + 动态规划+ 搜索。

总结可以解决问题的几个方法:

1、递归(很显然会超时)

3、记忆化搜索(有点动态规划的味道,最主要的就是记忆化,就是用一个数组标记是否被访问过)

if(dp[x][y] >= 0)
{
return dp[x][y];
}

状态转移方程:

dp[i][j] = max(dp[i-1][j],dp[i+1][j],dp[i][j-1],dp[i][j+1])+1

所以代码也是很容易实现了

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;#define MAX 105int r, h;int maps[MAX][MAX];int dp[MAX][MAX];const int moves[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};int DFS(int x, int y){int sum = 0;if(dp[x][y] >= 0){return dp[x][y];}else{for(int i = 0; i < 4; i++){int p = x + moves[i][0];int q = y + moves[i][1];if(p >= 1 && p <= r && q >= 1 && q <= h && maps[p][q] < maps[x][y]){ sum = max(sum,DFS(p,q));}}return dp[x][y] = sum + 1;}}int main(){freopen("in.txt","r",stdin);cin >> r >> h;for(int i = 1; i <= r; i++){for(int j = 1; j <= h; j++){cin >> maps[i][j];}}memset(dp, -1, sizeof(dp));int result = -1;for(int i = 1; i <= r; i++){for(int j = 1; j <= h; j++){result = max(result,DFS(i,j));}}cout << result << endl;return 0;}


原创粉丝点击