• 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
    ",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
    ",maxn);
    58     }
    59     return 0;
    60 }

     

     

  • 相关阅读:
    python分包写入文件,写入固定字节内容,当包达到指定大小时继续写入新文件
    java 封装及this 用法
    [效率提升] 记一次使用工具编辑正则表达式快速输出匹配结果
    java用星星符号打印出一个直角三角形
    java按行和列进行输出数据
    java 三种循环及注意事项
    数据的运算,求和,两数求最大,三数求最大,两数是否相等
    采用位异或方式将两个变量数值调换
    今天遇到一件开心事,在eclipse编写的代码在命令窗口中编译后无法运行,提示 “错误: 找不到或无法加载主类”
    定义 java 基本数据类型
  • 原文地址:https://www.cnblogs.com/A-FM/p/5411861.html
Copyright © 2020-2023  润新知