zoukankan      html  css  js  c++  java
  • [vijos1011]滑雪

    暴搜

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int num[505][505];
     7 int Ans=1,n,m;
     8 int fx[4]={0,0,1,-1};
     9 int fy[4]={1,-1,0,0};
    10 
    11 void dfs(int x,int y,int len){
    12     Ans=max(Ans,len);
    13     for (int i=0;i<4;i++)
    14       if (num[x][y]>num[x+fx[i]][y+fy[i]]&&num[x+fx[i]][y+fy[i]]!=-1)
    15         dfs(x+fx[i],y+fy[i],len+1);
    16 }
    17 
    18 int main(){
    19     freopen("ski.in","r",stdin);
    20     freopen("ski.out","w",stdout);
    21     scanf("%d%d",&n,&m);
    22     memset(num,-1,sizeof(num));
    23     for (int i=1;i<=n;i++)
    24       for (int j=1;j<=m;j++)
    25         scanf("%d",&num[i][j]);
    26     for (int i=1;i<=n;i++)
    27       for (int j=1;j<=m;j++){
    28           bool is_ok=0;
    29           for(int t=0;t<=3;t++)
    30             if (num[i][j]>num[i+fx[t]][j+fy[t]]&&num[i+fx[t]][j+fy[t]]!=-1) is_ok=1;
    31           if (is_ok==1) dfs(i,j,1);  
    32       }
    33     printf("%d",Ans);
    34     return 0;
    35 }
    View Code

    直接搜索无法很好的处理重叠子问题,因此可采用记忆化搜索以减少时间

    记忆化搜索

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 int f[505][505];//存储从(i,j)出发可滑的最长路径,避免重复搜索
     7 int num[505][505];
     8 int fx[4]={0,0,1,-1};
     9 int fy[4]={1,-1,0,0};
    10 
    11 int dfs(int x,int y){
    12     int tmp=0;
    13     if (f[x][y]!=-1) return f[x][y];
    14     for (int i=0;i<4;i++){
    15         if (num[x][y]>num[x+fx[i]][y+fy[i]]&&num[x+fx[i]][y+fy[i]]!=-1)
    16             tmp=max(tmp,dfs(x+fx[i],y+fy[i])+1);
    17     }
    18     if (tmp==0) {
    19         f[x][y]=1;
    20         return 1;
    21     }
    22     f[x][y]=tmp;
    23     return tmp;
    24 }
    25 int main(){
    26     int ans=1;
    27     freopen("ski2.in","r",stdin);
    28     freopen("ski2.out","w",stdout);
    29     int n,m;
    30     scanf("%d%d",&n,&m);
    31     memset(num,-1,sizeof(num));
    32     memset(f,-1,sizeof(f));
    33     for (int i=1;i<=n;i++)
    34       for (int j=1;j<=m;j++)
    35         scanf("%d",&num[i][j]);
    36     for (int i=1;i<=n;i++)
    37       for (int j=1;j<=m;j++)
    38         ans=max(ans,dfs(i,j));
    39     printf("%d
    ",ans);
    40     return 0;
    41 } 
    View Code
  • 相关阅读:
    Luogu P1004 方格取数
    Luogu P1896 [SCOI2005]互不侵犯
    Luogu P1879 [USACO06NOV]玉米田Corn Fields 【状压dp模板】
    高精度模板(结构体)
    【模板】快读
    vue input框type=number 保留两位小数自定义组件
    elementui表格表头合并
    将excle表中得数据生成insert语句插入到数据库中
    数据库基本语法
    ztree 数组和树结构互转算法
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/6056445.html
Copyright © 2011-2022 走看看