题解 P1434 【滑雪】

「QQ红包」

2017-08-16 21:31:38

Solution

搜索比较麻烦,感觉还是dp好.其实和搜索差不太多,dp[i][j]只能从四个方向走过来,而且四个方向的点的高度要大于这个点,于是就可以了. 还是很简洁的 ```cpp #include<bits/stdc++.h> using namespace std; int read() { char s; int k=0,base=1; while((s=getchar())!='-'&&s!=EOF&&!(s>='0'&&s<='9')); if(s==EOF)exit(0); if(s=='-')base=-1,s=getchar(); while(s>='0'&&s<='9') { k=k*10+(s-'0'); s=getchar(); } return k*base; } void write(int x) { if(x<0) { putchar('-'); write(-x); } else { if(x/10)write(x/10); putchar(x%10+'0'); } } int f[105][105]; int a[105][105]; int n,m,sum; int dp(int x,int y) { if (f[x][y]) return f[x][y];//直接返回值 int sum=0; if (x-1>0) if (a[x-1][y]>a[x][y]) sum=max(sum,dp(x-1,y)); if (x+1>0) if (a[x+1][y]>a[x][y]) sum=max(sum,dp(x+1,y)); if (y-1>0) if (a[x][y-1]>a[x][y]) sum=max(sum,dp(x,y-1)); if (y+1>0) if (a[x][y+1]>a[x][y]) sum=max(sum,dp(x,y+1)); f[x][y]=sum+1;//找max return f[x][y]; } int main() { n=read(); m=read(); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { a[i][j]=read(); } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { if (f[i][j]==0) f[i][j]=dp(i,j); sum=max(sum,f[i][j]);//更新答案 } printf("%d",sum);//输出 return 0; } ``` dp是0ms啊,没毛病