zoukankan      html  css  js  c++  java
  • POJ 1088

    http://poj.org/problem?id=1088

    一道中文题,这道题如果不限时的话,是个简单的搜索,但限时的话,就要用记忆化搜索

    所谓记忆化搜索就是对每一次搜索的结果进行记录,然后之后的如果需要使用到这次搜索的结果的话,就可以直接使用,不需要再去搜索,可以减少很多时间

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 
     5 using namespace std;
     6 int cub[104][104];
     7 bool jud[104][104];
     8 int dis[104][104];
     9 
    10 int m,n,max1,x,y,ans;
    11 
    12 int dfs(int i,int j){
    13     if(cub[i-1][j]<cub[i][j]){
    14         if(!jud[i-1][j]) {                  //这个就是我的记忆化搜索,把以前搜索到的结果,直接使用就可以。
    15             ans+=dis[i-1][j];
    16             if(ans>dis[x][y]) dis[x][y]=ans;
    17             ans-=dis[i-1][j];
    18         }
    19          else {
    20                 ans++;                
    21                 dfs(i-1,j);
    22                 if(ans>dis[x][y]) dis[x][y]=ans;
    23                 ans--;
    24         }
    25     }
    26     if(cub[i+1][j]<cub[i][j]){
    27         if(!jud[i+1][j]) {
    28             ans+=dis[i+1][j];
    29             if(ans>dis[x][y]) dis[x][y]=ans;
    30             ans-=dis[i+1][j];
    31         }
    32          else {
    33                 ans++;
    34                 dfs(i+1,j);
    35                 if(ans>dis[x][y]) dis[x][y]=ans;
    36                 ans--;
    37         }
    38     }
    39     if(cub[i][j-1]<cub[i][j]){
    40         if(!jud[i][j-1]) {
    41             ans+=dis[i][j-1];
    42             if(ans>dis[x][y]) dis[x][y]=ans;
    43             ans-=dis[i][j-1];
    44         }
    45          else {
    46                 ans++;
    47                 dfs(i,j-1);
    48                 if(ans>dis[x][y]) dis[x][y]=ans;
    49                 ans--;
    50 
    51         }
    52     }
    53     if(cub[i][j+1]<cub[i][j]){
    54        if(!jud[i][j+1]) {
    55             ans+=dis[i][j+1];
    56             if(ans>dis[x][y]) dis[x][y]=ans;
    57             ans-=dis[i][j+1];
    58         }
    59          else {
    60                 ans++;
    61                 dfs(i,j+1);
    62                 if(ans>dis[x][y]) dis[x][y]=ans;
    63                 ans--;
    64 
    65         }
    66     }
    67     jud[x][y]=false;              //每一个搜索后,对那个那个搜索后的点进行标记
    68     return 0;
    69 }
    70 int main(){
    71         scanf("%d%d",&m,&n);
    72         memset(dis,0,sizeof(dis));
    73         memset(jud,false,sizeof(jud));
    74         memset(cub,1,sizeof(cub));      //初始化1的目的就是边界。把那些边界的值都赋值为很大。memset赋值1的话,cub里面的数不是1.
    75         max1=0;
    76         for(int i=1;i<=m;i++)
    77             for(int j=1;j<=n;j++){
    78                 scanf("%d",&cub[i][j]);
    79                 dis[i][j]=1;
    80                 jud[i][j]=true;
    81             }
    82         for(x=1;x<=m;x++)
    83             for(y=1;y<=n;y++){
    84                 ans=1;
    85                 dfs(x,y);
    86                 if(max1<dis[x][y]) max1=dis[x][y];
    87             }
    88             printf("%d
    ",max1);
    89     return 0;
    90 }
  • 相关阅读:
    【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate
    【转载】ESFramework介绍之(20)―― 插件自动升级
    [转载]我的架构经验小结(一)-- 常用的架构模型
    [转载]TCP服务器“拒绝服务攻击” 解决方案
    【转载】我的架构经验小结(三)-- 深入三层架构
    【转载】动态加载dll
    CSS3动画之一:Transitions功能
    CSS3中的transform变形
    [转载]插件开发
    【转载】服务器系统自动升级
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5700361.html
Copyright © 2011-2022 走看看