记忆化搜素,即是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); } }