第七章的熟悉的味道,加上第九章一开始的嵌套正方形
因为终点不固定,似乎不方便递推
最后求所有出发点的dp值的最大值。
Run Time: 0.022s
#define UVa "9-1.10285.cpp" //Longest Run on a Snowboard char fileIn[30] = UVa, fileOut[30] = UVa; #include<cstring> #include<cstdio> #include<algorithm> using namespace std; //Global Variables. Reset upon Each Case! const int maxr = 100 + 5, maxc = 100 + 5, maxs = 1000 + 5; int step[2][4] = {{-1, 0, 1, 0},{0, 1, 0, -1}}; int N, R, C; char name[maxs]; int G[maxr][maxc]; int d[maxr][maxc]; int vis[maxr][maxc]; ///// int inside(int r, int c) { return (r >= 0 && r < R && c >= 0 && c < C); } int downward(int r, int c, int vr, int vc) { return G[vr][vc] < G[r][c];Longest Run on a Snowboard } int dp(int r, int c) { int& ans = d[r][c]; if(vis[r][c] == N) return ans; vis[r][c] = N; ans = 1; for(int i = 0; i < 4; i ++) { int vr = r + step[0][i], vc = c + step[1][i]; if(inside(vr, vc) && downward(r, c, vr, vc)) { ans = max(ans, dp(vr, vc) + 1); } } return ans; } int main() { memset(vis, -1, sizeof(vis)); scanf("%d", &N); while(N--) { scanf("%s%d%d", name, &R, &C); for(int i = 0; i < R; i ++) { for(int j = 0; j < C; j ++) { scanf("%d", &G[i][j]); } } int ans = 0; for(int i = 0; i < R; i ++) { for(int j = 0; j < C; j ++) { if(vis[i][j] != N) ans = max(ans, dp(i, j)); } } printf("%s: %d\n", name, ans); } return 0; }