n,k=map(int,input().split())
c=[]
dp=[0 for i in range(k+1)]
for i in range(n):
c.append(int(input()))
for i in range(1,k+1):
a=[]
for j in c:
if j <=i and dp[i-j]!=-1:
a.append(dp[i-j])
if not a:
dp[i]=-1
else:
dp[i]=min(a)+1
print(dp[k])
루프를 방지하기 위해 방문 확인 배열 c를 -1로 초기화하고 이동할 때마다 0으로 다시 설정해준다
1. 과정을 진행하면서 c에 이미 저장된 값이 0이면 목적지까지 갈 수 없으므로 0을 반환한다
2. 1 이상의 값이면 이전에 그만큼 방문 경로가 있으므로 해당 값을 반환해서 더해준다
3. -1이면 방문하지 않은 경로이므로 dfs + dp 수행
-정답풀이:
m,n = map(int,input().split())
a=[]
for i in range(m):
a.append(list(map(int,input().split())))
c=[[-1]*(n) for i in range(m)]
dx=[1,-1,0,0]
dy=[0,0,1,-1]
def dfs(x,y):
if x==m-1 and y ==n-1:
return 1
if c[x][y]!=-1:
return c[x][y]
c[x][y]=0
for i in range(4):
nx=x+dx[i]
ny=y+dy[i]
if 0<= nx < m and 0<=ny<n:
if a[nx][ny]<a[x][y]:
c[x][y]+=dfs(nx,ny)
return c[x][y]
print(dfs(0,0))
-전체풀이:
파이썬으로 실행하면 Recurssion Error 때문에 Pypy3로 실행해야한다
세로 리스트가 입력된다는 것을 알고 문제를 풀어야한다
초기값 설정. m이 컬럼 개수, n이 행 개수. 컬럼위주로 진행해야한다(4,5번라인)
이해 안가는 부분: 7번(밑에처럼 하면 mxn 행렬이 만들어지는 것 아닌가?)
dx=[동,서,북,남] , dy=[동,서,북,남] 을 표현 한 것 같음
인덱스가 행렬 가장 오른쪽 아래면 멈추고 1 반환한다
값이 -1이 아니면 이 전에 방문된 기록이 있으므로 그 기록을 반환한다
이제 c[x][y]==-1이면 방문하지 않은 경로이고, 루프를 막아야하므로 0으로 초기화하고 시작한다