记忆化搜素

记忆化搜素,即是dfs+dp,保存每次搜素到的结果,可以当模板记住

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

 
import java.util.*;
 
public class Main1 {
    static int a[][] = new int[105][105];
    static int g[][]={{-1,0},{0,1},{1,0},{0,-1}};
    static int dp[][] = new int[105][105];
   public static int dfs(int x,int y, int a[][],int n,int m){
       if(dp[x][y]>0)return dp[x][y];
       dp[x][y]=1;
       for(int i=0;i<4;i++){
           int xx = x+g[i][0];
           int yy = y+g[i][1];
           if(xx>=0&&yy>=0&&yy<m&&xx<n&&a[xx][yy]<a[x][y]){
               dp[x][y]=Math.max(dp[x][y], dfs(xx,yy,a,n,m)+a[x][y]);
           }
       }
       return dp[x][y];
   }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n  =sc.nextInt();
        int m  = sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                a[i][j]=sc.nextInt();
        int max=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                int tep=dfs(i,j,a,n,m);
                if(tep>max)
                    max=tep;
                      }
        System.out.println(max);
    }    
    }
 
    

http://acm.hdu.edu.cn/showproblem.php?pid=1078

 

import java.util.*;
 
public class Main1 {
    static int a[][] = new int[105][105];
    static int g[][]={{-1,0},{0,1},{1,0},{0,-1}};
    static int dp[][] = new int[105][105];
   public static int dfs(int x,int y, int a[][],int n,int k){    此时的k是走的最大步数
       if(dp[x][y]>0)return dp[x][y];
//       dp[x][y]=1;
       int temp,ans=0;
       for(int j=1;j<=k;j++)
       for(int i=0;i<4;i++){
           
           int xx = x+j*g[i][0];
           int yy = y+j*g[i][1];
           if(xx>=0&&yy>=0&&yy<n&&xx<n&&a[xx][yy]>a[x][y]){
               temp = dfs(xx, yy, a, n, k);
              if(temp>ans)
                  ans= temp;
           }
           dp[x][y]=ans+a[x][y];
       }
       return dp[x][y];
   }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n  =sc.nextInt();
        int m  = sc.nextInt();
//        Arrays.fill(dp, 0);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                dp[i][j]=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                a[i][j]=sc.nextInt();
        int max=0;
//        for(int i=0;i<n;i++)
//            for(int j=0;j<m;j++)
//            {
//                int tep=dfs(i,j,a,n,m);
//                if(tep>max)
//                    max=tep;
//                      }
        max = dfs(0, 0, a, n, m);
        System.out.println(max);
    }    
    }
 
    
原文地址:https://www.cnblogs.com/ls-pankong/p/10507510.html