马上省赛了,还是刷水题的弱菜。。。
六级 + 省赛 + 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; }