skiing 暴力搜索 + 动态规划
我的代码上去就是 直接纯粹的 暴力 . 居然没有超时 200ms 可能数据比较小 一会在优化
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<limits.h> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; int n,m,a[105][105],visited[105][105],b[4][2]={0,-1,0,1,-1,0,1,0},minn; void DFS(int y,int x,int now) { for(int i=0;i<4;i++) { int x1=x+b[i][1],y1=y+b[i][0]; if(x1>=0&&x1<m&&y1>=0&&y1<n&&!visited[y1][x1]&&a[y1][x1]<a[y][x]) { now++; if(now>minn) minn=now; visited[y1][x1]=1; DFS(y1,x1,now); visited[y1][x1]=0; now--; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); minn=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { memset(visited,0,sizeof(visited)); visited[i][j]=1; DFS(i,j,1); } printf("%d\n",minn); } }
下面附上 动态规划的 解法 这个 动态规划 是一种 人人为我 , 的思想 , 先根据 高度进行从小到的 排序 然后 然后从 第二小的 开始 检查 周围是否 有比他 还小的 , 如果有的话 , 将周围的 +1 个 自身相比 取最大值 , 废话少说 放码过来
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<limits.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<set> 10 #include<stack> 11 #include<string> 12 #include<sstream> 13 #include<map> 14 #include<cctype> 15 using namespace std; 16 struct node 17 { 18 int x,y,h; 19 }a[10005]; 20 bool cmp(node example_a,node example_b) 21 { 22 return example_a.h<example_b.h; 23 } 24 int b[4][2]={0,-1,0,1,-1,0,1,0},c[105][105],d[105][105]; 25 int main() 26 { 27 int t; 28 scanf("%d",&t); 29 while(t--) 30 { 31 int n,m; 32 scanf("%d%d",&n,&m); 33 int total=0; 34 for(int i=0;i<n;i++) 35 { 36 for(int j=0;j<m;j++) 37 { 38 d[i][j]=1; 39 scanf("%d",&c[i][j]); 40 a[total].h=c[i][j],a[total].x=j,a[total].y=i; // 将所有的 长度 默认为 1 41 total++; 42 } 43 } 44 sort(a,a+total,cmp); 45 int maxn=1; 46 for(int i=1;i<total;i++) // 从 第二小的 开始 当周围 有 比他小 的 就 +1 47 { 48 for(int j=0;j<4;j++) 49 { 50 if(a[i].x+b[j][1]>=0&&a[i].x+b[j][1]<m&&a[i].y+b[j][0]>=0&&a[i].y+b[j][0]<n&&c[a[i].y][a[i].x]>c[a[i].y+b[j][0]][a[i].x+b[j][1]]) 51 { 52 d[a[i].y][a[i].x]=max(d[a[i].y][a[i].x],d[a[i].y+b[j][0]][a[i].x+b[j][1]]+1); 53 maxn=max(maxn,d[a[i].y][a[i].x]); 54 } 55 } 56 } 57 printf("%d\n",maxn); 58 } 59 return 0; 60 }