[DP 训练] Longest Run on a Snowboard, UVa 10285

来源:互联网 发布:求购湖南快乐十分源码 编辑:程序博客网 时间:2024/04/30 15:47

题意

在一个R*CR,C≤100)的整数矩阵上找一条高度严格递减的最长路。 起点任意,但每

次只能沿着上下左右4个方向之一走一格,并且不能走出矩阵外。 如图9-29所示,最长路就

是按照高度25, 24, 23,…, 2, 1这样走,长度为25。 矩阵中的数均为0100


1
asdf 5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9


asdf: 25


上面样例清晰明了又好调试233

2
Feldberg 10 5
56 14 51 58 88
26 94 24 39 41
24 16 8 51 51
76 72 77 43 10
38 50 59 84 81
5 23 37 71 77
96 10 93 53 82
94 15 96 69 9
74 0 62 38 96
37 54 55 82 38
Spiral 5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
DP,模拟。。

或者称之为记忆化搜索更合适?只不过递推写的

#include<bits/stdc++.h>using namespace std;int T,R,C,ans;int a[110][110];int dp[110][110];char s[110];const int dx[]={0,0,1,-1};const int dy[]={1,-1,0,0};#define inrange(x,y) (1<=(x)&&(x)<=R&&1<=(y)&&(y)<=C)void walk(int x,int y){for(int k=0;k<4;k++){int nx = x+dx[k];int ny = y+dy[k];if(inrange(nx,ny)&&a[x][y]>a[nx][ny]){if(dp[x][y]+1>dp[nx][ny]){dp[nx][ny] = dp[x][y]+1;if(dp[nx][ny]>ans)ans = dp[nx][ny];walk(nx,ny);}}}}int main(void){ios::sync_with_stdio(false);cin>>T;while(T--){cin>>s>>R>>C;for(int i=1;i<=R;i++){for(int j=1;j<=C;j++){cin>>a[i][j];dp[i][j] = 1;}}ans = 0;for(int i=1;i<=R;i++){for(int j=1;j<=C;j++){walk(i,j);}}cout<<s<<": "<<ans<<endl;}return 0;}


1 0
原创粉丝点击