10285 - Longest Run on a Snowboard(DP)

来源:互联网 发布:linux sem trywait 编辑:程序博客网 时间:2024/05/16 09:10

比较简单的DP,用记忆化搜索比较简单,递推。。。应该不好写吧 。  

很容易发现,对于同一个位置,它的最长路是一定的, 不会变的,因为路是递减的,所以该题很适合用记忆化搜索 。  由此我们也可以发现DP和搜索的联系 。

代码如下:

#include<bits/stdc++.h>using namespace std;int T,r,c,a[105][105],d[105][105];int dx[] = {0,1,0,-1};int dy[] = {1,0,-1,0};char name[1000];int dp(int i,int j) {    int& ans = d[i][j];    if(ans >= 0) return ans;    ans = 1;    for(int k=0;k<4;k++) {        int u = i+dx[k];        int v = j+dy[k];        if(u<1||u>r||v<1||v>c) continue;        if(a[u][v]<a[i][j]) ans = max(ans,dp(u,v)+1);    }    return ans;}int main() {    scanf("%d",&T);    while(T--) {        scanf("%s%d%d",name,&r,&c);        memset(d,-1,sizeof(d));        for(int i=1;i<=r;i++)            for(int j=1;j<=c;j++)                scanf("%d",&a[i][j]);        int ans = 0;        for(int i=1;i<=r;i++)             for(int j=1;j<=c;j++)                 ans = max(ans,dp(i,j));        printf("%s: %d\n",name,ans);    }    return 0;}


1 0