1088:滑雪 10285:Longest Run on a Snowboard
問題文
POJ
http://poj.org/problem?id=1088
UVa
http://uva.onlinejudge.org/external/102/10285.html
縦r,横cのグリッドが与えられる。
上下左右で、数字が現在のセルより小さいセルにのみ移動可能。
移動できる最長経路の長さを求めよ。
メモ化再帰した。
POJ
#include<iostream> #include<vector> #include<algorithm> using namespace std; int grid[101][101],r,c; bool visit[101][101]; int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; int dp[101][101]; int rec(int x,int y){ if(dp[y][x]>0)return dp[y][x]; int res=0; visit[y][x]=true; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx<0 || ny<0 || c<=nx ||r<=ny)continue; if(visit[ny][nx] || grid[y][x]<=grid[ny][nx])continue; res=max(res,rec(nx,ny)); } visit[y][x]=false; return dp[y][x]=res+1; } int main(void){ cin >> r >> c; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin >> grid[i][j]; } } int ans=0; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ fill(visit[0],visit[101],false); ans=max(ans,rec(j,i)); } } cout << ans << endl; return 0; }
UVa
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; int grid[101][101],r,c; bool visit[101][101]; int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; int dp[101][101]; int rec(int x,int y){ if(dp[y][x]>0)return dp[y][x]; int res=0; visit[y][x]=true; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx<0 || ny<0 || c<=nx ||r<=ny)continue; if(visit[ny][nx] || grid[y][x]<=grid[ny][nx])continue; res=max(res,rec(nx,ny)); } visit[y][x]=false; return dp[y][x]=res+1; } int main(void){ int n; cin >> n; while(n--){ string name; cin >> name; cin >> r >> c; fill(dp[0],dp[101],0); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin >> grid[i][j]; } } int ans=0; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ fill(visit[0],visit[101],false); ans=max(ans,rec(j,i)); } } cout << name << ": " << ans << endl; } return 0; }