POJ1088滑雪
马上省赛了,还是刷水题的弱菜。。。
六级 + 省赛 + 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 105
int 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;
}
Keep it simple!

浙公网安备 33010602011771号