스키 OpenJBailian-1088 JAVA 기억 화 검색 이 중요 합 니 다.
OpenJ_Bailian - 1088
마 이 클 이 스키 백 을 좋아 하 는 것 은 이상 하지 않다.왜냐하면 스키 는 확실히 자극 적 이기 때문이다.그러나 속 도 를 얻 기 위해 서 는 미 끄 러 지 는 구역 이 아래로 기울 어야 하고,언덕 아래로 미 끄 러 지면 다시 언덕 을 올 라 가 거나 승강기 가 태 워 줄 때 까지 기 다 려 야 한다.마 이 클 은 한 지역 에서 가장 긴 슬로프 를 싣 고 싶 어 한다.구역 은 2 차원 배열 로 제 시 됩 니 다.배열 의 모든 숫자 대표 점 의 높이.다음은 하나의 예 이다.
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
한 사람 은 어떤 점 에서 상하 좌우 로 네 개의 점 중 하나 로 미 끄 러 질 수 있 으 며,높이 만 줄 일 수 있다.위의 예 에서 미 끄 러 질 수 있 는 슬로프 는 24-17-16-1 이다.그럼요.25-24-23-...-3-2-1 이 더 길 어 요.사실 이것 이 가장 긴 것 이다.
Input
입력 한 첫 줄 은 영역의 줄 수 R 과 열 수 C(1<=R,C<=100)를 표시 합 니 다.다음은 R 줄 이 고 줄 마다 C 개의 정수 가 있 으 며 높이 h,0<=h<=10000 을 대표 합 니 다.
Output
출력 최 장 영역의 길이 입 니 다.
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Sample Output
25
이 문 제 는 여러 번 고 쳐 서 많은 부분 을 제대로 이해 하지 못 했 습 니 다.특히 DFS 에 대해 서 는(예전 에 도 많이 만 났 습 니 다)너무 오래 연습 하지 않 아서 많은 문제 에 부 딪 혔 습 니 다.
1.DFS 와 BFS 는 반드시 사용 환경 을 구분 하고 BFS 의 vis 가 공용 이라는 것 을 알 아야 한다.
2.DFS 의 vis 는 true 이후 false 로 바 꿔 야 합 니 다.주의 하 세 요!수 정 된 vis 를 매개 변수 로 전달 할 수 없습니다.전 달 된 VIS(배열)는 주소 이기 때문에 새로운 DFS 에서 VIS 를 수정 한 후에 모든 vis 를 수정 하여 본 체 를 바 꾸 지 않 는 효과 에 이 르 지 못 합 니 다!
3.기억 화 검색,DFS 의 정의 와 DP 의 정의 에 주의
dp[i][j]는 바로 대 점 i,j 의 가장 먼 활주 경로 이다.0 이 되 지 않 으 면 반드시 성립 되 고 완전 하 다.
dfs(i,j),출력 은 dp[i][j]입 니 다.dp[i][j]가 모 를 때 만 사용 할 수 있 는 전략 입 니 다.
DFS 출력 은 영원히 dp[i][j]
AC 코드:(타고 난 방문 순서 가 있 기 때문에 arr[i][j]>arr[ti][tj]를 고려 하지 않 아 도 됩 니 다.중복 방문 은 걱정 하지 않 아 도 됩 니 다)
import java.util.Scanner;
public class Main{
static int arr[][];
static int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
static int x,y;
static int dp[][];
// static boolean vis[][];
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
x = sc.nextInt();
y = sc.nextInt();
arr = new int[x][y];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = sc.nextInt();
}
}
dp = new int[x][y];
int max = -1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
max = Math.max(max, dfs(i,j));
}
}
System.out.println(max);
}
private static int dfs(int i, int j) {
if(dp[i][j]!=0) return dp[i][j];
int ans = 0;
for (int p = 0; p < dir.length; p++) {
int xx = i+dir[p][0];
int yy = j+dir[p][1];
if(xx>=0&&yy>=0&&xx
시간 초과 코드:DFS+가지치기(팬)
import java.util.Scanner;
public class Main{
static int arr[][];
static int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
static int x,y;
static int dp[][];
static boolean vis[][];
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
x = sc.nextInt();
y = sc.nextInt();
arr = new int[x][y];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = sc.nextInt();
}
}
vis = new boolean[x][y];
dp = new int[x][y];
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[i].length; j++) {
dp[i][j] = 1;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
vis[i][j]=true;
dfs(i,j,1);
vis[i][j]=false;
}
}
int max = -1;
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[i].length; j++) {
if(max=0&&yy>=0&&xxarr[i][j]) {
vis[xx][yy]=true;
dfs(xx,yy,k+1);
vis[xx][yy]=false;
}
}
}
dp[i][j] = Math.max(dp[i][j], k);
return k;
}
}
최초의 어리석음(대량 중복 무효 작업)코드:(순수 DFS,시간 초과)
import java.util.Scanner;
public class Main{
static int arr[][];
static int ans = -1;
static int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
static int x,y;
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
x = sc.nextInt();
y = sc.nextInt();
arr = new int[x][y];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = sc.nextInt();
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
boolean vis[][] = new boolean[x][y];
vis[i][j] = true;
dfs(i,j,1,vis);
vis=null; // ,
// BFS, VIS
// q.clear();
// q.add(new Node(2,2,1));
// while(!q.isEmpty()) {
// temp = q.poll();
// vis[temp.x][temp.y] = true;
// if(temp.l>ans) ans= temp.l;
// for (int k = 0; k < dir.length; k++) {
//// System.out.println(temp.x+" "+temp.y+" "+dir[k][0]+" "+dir[k][1]);
// xx = temp.x+dir[k][0];
// yy = temp.y+dir[k][1];
// if(xx>=0 && xx=0 && yyans) ans= k;
for (int p = 0; p < dir.length; p++) {
int xx = i+dir[p][0]; //new int!
int yy = j+dir[p][1];
if(xx>=0 && xx=0 && yy
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.