๋์ ๊ณํ ์๊ณ ๋ฆฌ์ฆ(DP)
์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋์ด์ ํผ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ก ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ
๋ถ๋ถ ๋ฌธ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅ->์๊ณต๊ฐ์ ํจ์จ ์ฆ๊ฐ
memoization ํ์ฉ
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(๊ธฐ๋ณธ ๋ฌธ์ ์ ์ต์ ํด๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ํฌํจ)
DP ์ ์ฉ ์ฌ๋ถ ํ๋จ ๋ฐฉ๋ฒ
1.๋ฌธ์ ๋ฅผ ๊ฐ์ ํํ์ ํ์ ๊ตฌ์กฐ๋ก ๋๋ ์ ์๋๊ฐ
2.ํ์ ๋ฌธ์ ์ ๊ณ์ฐ์ด ๋ฐ๋ณต๋๋๊ฐ
(์ต์ ํ, ์ต๋ํ, ์ต์ํ, ์ด๋ก ์์ ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ธ๊ฐ *์ ๋งคํ ๊ฒฝ์ฐ์ ์ฐธ๊ณ ํ ์ ์๋ ๋ํ์ ์ธ DP ๋ฌธ์ ์ ํ)
DP ์ ์ฉ ๊ณผ์
1. ์ ํ์ / ์ฌ๊ท ๊ณผ์ ์ ์
- ๋ฌธ์ ๋ฅผ Top-Down(ํํฅ์/์ฌ๊ท) ์ผ๋ก ์ ์ํ๋ค
- ๋ฌธ์ ํ์ด์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ์ ํ์ ๋ถ๋ถ ๊ฐ์ ์ด๊ธฐํ
- ์ข ๋ฃ ์กฐ๊ฑด ์ถ๊ฐ
2. memoization ์ ์ฉ
3. bottom-up(์ํฅ์/๋ฐ๋ณต๋ฌธ) ์ฆ, DP ๋ก ํ์ด
๋์ ๊ณํ๋ฒ์ ์ฌ์ฉ
1. ํผ๋ณด๋์น ์์ด
์ฌ๊ท ํจ์๋ก ํํํ๋ฉด f(1), f(2) ๋ฑ ํ์ ๋ถ๋ถ์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ -> ๋นํจ์จ์
dp[i]=dp[i-1]+dp[i-2] ๋ก ํ์ด ๊ฐ๋ฅ
2. ์ญ๊ฐ ๊ฑฐ๋ฆฌ ์ต์๊ฐ ๋ฌธ์
0~n-1 ๊น์ง n๊ฐ์ ์ญ์ด ์กด์ฌํ๊ณ ํ ๋ฐฉํฅ(๋จ๋ฐฉํฅ ๊ทธ๋ํ)์ผ๋ก ์ด๋ํ ๋, ์ญ๋ถํฐ ์ญ ์ฌ์ด ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์
naiveํ๊ฒ ์ ๊ทผํ๋ฉด, 0์์ 4๊น์ง ์ด๋ํ๋ ค๊ณ ํ ๋, (0,3)+(3,4) / (0,2)+(2,4) / (0,1)+(1,4) ์ ๊ฒฝ์ฐ๋ฅผ ๋น๊ตํ ์ ์๊ณ ์ด๋ ๋ ((0,1)+(1,3))+(3,4) ๋ฑ์ผ๋ก ์๊ฒ ๋๋์ด์ง ์ ์๋ค. ๊ณ์ฐ์ ๋ฐ๋ณต์ด ์ฆ๊ธฐ ๋๋ฌธ์ ์ต์ ํ๊ฐ ํ์ํ๋ค.
naiveํ ํ์ด๋ฒ ์ฝ๋
n=4
cost=[[0,10,75,94],[-1,0,35,50],[-1,-1,0,80],[-1,-1,-1,0]]
def minCost(s,d):
if(s==d or s==d-1):
return cost[s][d]
min_value=cost[s][d]
for i in range(s+1,d):
temp=minCost(s,i)+minCost(i,d)
min_value=min(temp,min_value)
return min_value
print(minCost(0,3))
memoization์ ์ฌ์ฉํ์ฌ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ฉด ํ์ ๋ฌธ์ ์ ๋ฐ๋ณต ๊ณ์ฐ์ ํผํ๋ฉด์ ๋ฌธ์ ๋ฅผ ๊ตฌ์ฒดํํ ์ ์๋ค.
memo๋ผ๋ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ ๊ณ์ฐํ cost ๊ฐ์ ์ ์ฅํด์ฃผ๊ณ memo ๊ฐ์ด ์์ผ๋ฉด ๋ ๊ณ์ฐํ์ง ์๊ณ ๋ฐ๋ก ๊ทธ ๊ฐ์ return ํด์ฃผ๋ฉด ๋๋ค.
memoization ํ์ด๋ฒ ์ฝ๋
n=4
cost=[[0,10,75,94],[-1,0,35,50],[-1,-1,0,80],[-1,-1,-1,0]]
memo=[[0]*4 for _ in range(n)]
def minCost(s,d):
if s==d or s==d-1:
return cost[s][d]
if not memo[s][d]:
value=cost[s][d]
for i in range(s+1,d):
temp=minCost(s,i)+minCost(i,d)
value=min(value,temp)
memo[s][d]=value
return memo[s][d]
print(minCost(0,3))
memoization๋ ์ฌ๊ท ํธ์ถ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๋ก ์ธํด ์๋๊ฐ ๋๋ฆด ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DP ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
dp ํ์ด๋ฒ ์ฝ๋
n=4
cost=[[0,10,75,94],[-1,0,35,50],[-1,-1,0,80],[-1,-1,-1,0]]
mincost=[10**6]*n
mincost[0]=0
mincost[1]=cost[0][1]
for i in range(2,n):
mincost[i]=cost[0][i]
for j in range(1,i):
mincost[i]=min(mincost[j]+cost[j][i],mincost[i])
print(*mincost)
3. ๋ฐฐ๋ญ ๋ฌธ์
๊ฐ ๋ฌผ๊ฑด์ ๊ฐ์ค์น์ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ๋ฐฉ์ ์ต๋ํ ๋ง์ ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋๋ก ํ๋ ๋ฌธ์
-๋ฐฐ๋ญ์ ๋ฌด๊ฒ์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํ์ฌ ๋ด์ ์ ์๋์ง ํ๋จํ๋ค
-๋ฐฐ๋ญ์ ์๋ก ๋ฌผ๊ฑด์ ๋ฃ์ง ๋ชปํ๋ฉด ์ด์ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉ
์ด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ฉด
w=[1,4,3]
v=[15,30,20]
def knapsack(w,v,n,c):
if(n<=0 or c<=0):
return 0
if w[n-1]>c:
return knapsack(w,v,n-1,c)
carry=v[n-1]+knapsack(w,v,n-1,c-w[n-1]) #์ง์ด๋ฃ์ ๋ฌผ๊ฑด ๋งํผ ์ฉ๋ ๋นผ์ค
leave=knapsack(w,v,n-1,c) #๋ฌผ๊ฑด ๋ฃ์ง ์๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ
print(carry,leave)
return max(carry,leave)
print(knapsack(w,v,3,4))
์ด์ ๊ฐ์ด ๊ตฌํ ํ ์ ์๋ค.
์ด๋ฅผ ์ผ๋ฐํํ๋ฉด, cell[i][j]์ max ๊ฐ์
-์ง๊ธ ๊น์ง ๊ตฌํ cell[i-1][j]์ ๊ฐ ์ค max ๊ฐ
-ํ์ฌ ๋ฌผ๊ฑด์ ๊ฐ์น + ๋จ์ ๊ณต๊ฐ์ ๊ฐ์น(cell[i-1][j-๋ฌผ๊ฑด๋ฌด๊ฒ])
๋ฅผ ๋น๊ตํ ๊ฐ์ด๋ค.
DP๋ก ๊ตฌํํ ์ฝ๋
w=[1,4,3]
v=[15,30,20]
def knapsack(w,v,n,c):
cell=[[-1]*(c+1) for _ in range(n+1)]
for i in range(n+1):
cell[i][0]=0
for j in range(c+1):
cell[0][j]=0
# cell#์ด๊ธฐํ
for i in range(1,n+1):
for j in range(1,c+1):
if w[i-1]<=j: #๋ฐฐ๋ญ ์์ ๋ค์ด์ฌ ์ ์์ผ๋ฉด
x=j-w[i-1]
##๋จ๋ ๊ณต๊ฐ
cell[i][j]=max(cell[i-1][j],v[i-1]+cell[i-1][x])
else:
cell[i][j]=cell[i-1][j] #๋ฐฐ๋ญ์ ๋ฃ์ง ๋ชปํ๋ฉด ๊ทธ๋๋ก ์ด์ ๊ฐ
print(*cell)
knapsack(w,v,3,4)
4. ๋ถ๋ถ๋ฌธ์์ด ๋ฌธ์
์ด๋ ํ ๋ฌธ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ถ๋ถ ๋ฌธ์์ด์ ํฉ์ด ๊ฐ๋๋ก ๋ฌธ์์ด์ ์ ํํ ๋, ๊ทธ ๊ธธ์ด๊ฐ ์ต๋๊ฐ ๋๋๋ก ํ๋ ๋ฌธ์
(์ฆ, [0-3]์ ๋ฌธ์์ด์ ์ ํํ๋ฉด [0-1]๊น์ง ๋ฌธ์์ด์ ํฉ๊ณผ [2-3]๊น์ง ๋ฌธ์์ด์ ํฉ์ด ๊ฐ๊ณ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ 4)
์ด ๋ฌธ์ ๋ ๋จ์ํ๊ฒ bruteforce ๋ฐฉ์์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ํ์ํ๋ฉด์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ ์ ์๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ํ์ํ๊ณ ์ด๊ฐ 3์ค for๋ฌธ์ผ๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ O(n^3)์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ง๋๋ค.
bruteforce ์ฝ๋ ๊ตฌํ
string='9430726'
def maxSubstring(string):
n=len(string)
result=0
for i in range(n):
for j in range(i+1,n,2):
leng=j-i+1 #ํ์ฌ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด
if(result>=leng):
continue
lsum=0;rsum=0
for k in range(leng//2):
lsum+=int(string[i+k])
rsum+=int(string[i+k+leng//2])
if lsum==rsum:
result=leng
return result
print(maxSubstring(string))
๋ฌธ์ ๋ฅผ ์์ธํ ๋ค์ฌ๋ค๋ณด๋ฉด, ์ด๋ฏธ ํ์ํ๋ ๋ถ๋ถ ๋ฌธ์์ด๋ค์ ๋ํด์๋
dp[i][j]=dp[i][k]+dp[k][j] ๋ก ์ ํ์์ ์ธ์ธ ์ ์๋ค.
์ด๋ k๋ i-j์ ๊ธธ์ด์ ์ ๋ฐ์ผ๋ก ๋ ๋ฌธ์์ด์ ๋๋๋ ๊ธฐ์ค์ด๋ฉฐ
dp[i][k] ๊ฐ๊ณผ dp[k+1][j]์ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๋ถ๋ถ ๋ฌธ์์ด์ ํฉ์ด ๊ฐ์ผ๋ฏ๋ก ๊ธฐ์กด์ result๊ฐ๊ณผ ๋น๊ตํ์ฌ ๊ฐฑ์ ํด์ค๋ค.
์ด๋ 2์ค for๋ฌธ์ผ๋ก ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
dp์ฝ๋ ๊ตฌํ
string='9430726'
def maxString(string):
result=0
n=len(string)
dp=[[0]*n for _ in range(n)]
for i in range(n):
dp[i][i]=int(string[i]) #์๊ธฐ ์์ ๊ฐ์ผ๋ก ์ด๊ธฐํ =
for leng in range(2,n+1):
for i in range(n-leng+1):
j=i+leng-1
k=(i+j)//2
#j,k
dp[i][j]=dp[i][k]+dp[k+1][j]
if dp[i][k]==dp[k+1][j] and leng%2==0:
result=max(result,leng)
print(dp)
return result
print(maxString(string))
5. ์ต์๋น์ฉ๊ฒฝ๋ก
(0,0)์์ (m-1, n-1) ๊น์ง ์ด๋ํ ๋, ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์ด ๋ ์ด๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ (+1,0) ๋๋ (0,+1) ๋ก ๋๊ฐ์ง ๋ฐฉํฅ์ผ๋ก๋ง ์ด๋ ๊ฐ๋ฅํ๋ค.
[x][y]๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ์ [x-1][y]๊น์ง ์ด๋ํ ๋น์ฉ์ cost[x][y]์ [x][y-1]๊น์ง ์ด๋ํ ๋น์ฉ์ cost[x][y]๋ฅผ ๋ํ ๊ฐ์ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ฃผ๋ฉด ๋๋ค.
์ด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ฉด
m=3
n=4
cost=[[1,3,5,8],[4,2,1,7],[4,3,2,3]]
def minPath(cost,m,n):
if m==0 and n==0:
return cost[0][0]
if m==0:
return minPath(cost,0,n-1)+cost[0][n]
if n==0:
return minPath(cost,m-1,0)+cost[m][0]
x=minPath(cost,m-1,n)
y=minPath(cost,m,n-1)
return min(x,y)+cost[m][n]
print(minPath(cost,m-1,n-1))
์์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
์ด๋ ํ์ ๋ถ๋ถ์ ๊ณ์ฐ์ด ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์
memoization ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ฉด
m=3
n=4
cost=[[1,3,5,8],[4,2,1,7],[4,3,2,3]]
memo=[[0]*n for _ in range(m)]
def minPath(cost,m,n):
if memo[m][n]!=0:
return memo[m][n]
##์ด์ ์ ๊ณ์ฐ๋์๋ค๋ฉด ๋ฐ๋ณต ๊ณ์ฐ X ๋ฐ๋ก ๊ฒฐ๊ณผ return
if m==0 and n==0:
memo[m][n]=cost[0][0]
elif m==0:
memo[m][n]=minPath(cost,0,n-1)+cost[0][n]
elif n==0:
memo[m][n]=minPath(cost,m-1,0)+cost[m][0]
else:
x=minPath(cost,m-1,n)
y=minPath(cost,m,n-1)
memo[m][n]=min(x,y)+cost[m][n]
#๋ ์ค ๋ ์์ ๊ฐ์ผ๋ก ์
return memo[m][n]
print(minPath(cost,m-1,n-1))
์์ฒ๋ผ memo ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ด์ ์ ๊ณ์ฐ๋์๋ ๊ฐ๋ค์ ๋์ด์ ๊ณ์ฐํ์ง ์๊ณ ๋ฐ๋ก return ํ ์ ์๋ค.
์ด๋ฅผ ๋ฐ๋ณต๋ฌธ๊ณผ ๋ค์์ ์ ํ์
dp[x][y]=min(dp[x-1][y],dp[x][y-1])+cost[x][y]
์ ์ฌ์ฉํ์ฌ DP๋ก ๊ตฌํํด๋ณด๋ฉด
m=3
n=4
cost=[[1,3,5,8],[4,2,1,7],[4,3,2,3]]
dp=[[10**6]*n for _ in range(m)]
def minPath(cost,m,n):
dp[0][0]=cost[0][0]
for i in range(1,m):
dp[i][0]=dp[i-1][0]+cost[i][0]
for j in range(1,n):
dp[0][j]=dp[0][j-1]+cost[0][j]
for x in range(1,m):
for y in range(1,n):
dp[x][y]=min(dp[x-1][y],dp[x][y-1])+cost[x][y]
return dp[m-1][n-1]
print(minPath(cost,m,n))
์ด๋ ๊ฒ ๊ตฌํํ ์ ์๋ค.
์ด๋, dp[0][0] ๊ฐ์ ์๊ธฐ ์์ ์ ๋น์ฉ์ด๋ฏ๋ก cost[0][0]์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
0๋ฒ์งธ ํ์ด๋ 0๋ฒ์งธ ์ด์ ๊ฐ์ ์ด๋์ด ํ ๋ฐฉํฅ์ผ๋ก ์ ํ์ ์ด๋ฏ๋ก ๊ทธ์ ๋ง๊ฒ ์ ํ์์ ์ธ์์ค๋ค.
6. ํ์ผ์ฑ์ฐ๊ธฐ
๋์ด๊ฐ 2์ด๊ณ ๋๋น๊ฐ n์ธ ๋ฐ๋ฅ์ด ์์ ๋, ๋์ด๊ฐ 2์ด๊ณ ๋๋น๊ฐ 1์ธ ํ์ผ์ผ๋ก ๋ฐ๋ฅ์ ์ฑ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๋๋น๊ฐ 1์ธ ๊ฒฝ์ฐ์๋ ํ๊ฐ์ง,
๋๋น๊ฐ 2์ธ ๊ฒฝ์ฐ์๋ ||,= ์ผ๋ก ๋๊ฐ์ง ์ด๋ฏ๋ก ์ด ๊ฐ์ ์ด๊ธฐํํด๋๊ณ
๊ทธ ๋ค์ ํ์ผ๋ถํฐ๋ i-1 ๋๋น์ ๋ฐ๋ฅ์ ์ฑ์ฐ๋ ๊ฒฝ์ฐ์ ์์ i-2 ๋๋น์ ๋ฐ๋ฅ์ ์ฑ์ฐ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ ๊ฐ๊ณผ ๊ฐ๋ค.
์ฆ, ํผ๋ณด๋์น ์์ด๊ณผ ๋น์ทํ ์ ํ์
dp[i]=dp[i-2]+dp[i-1]
์ ์ฌ์ฉํ ์ ์๊ณ ์ด ์์์ ์ด๊ธฐํ ๊ฐ (dp[1],dp[2])๋ง ๋ค๋ฅธ ๋ฌธ์ ์ด๋ค.
DP์ฝ๋
def tilePlacement(n):
tiles=[0]*(n+1)
tiles[1]=1
tiles[2]=2
for i in range(3,n+1):
tiles[i]=tiles[i-1]+tiles[i-2]
print(tiles)
return tiles[n]
print(tilePlacement(5))
7. ํน์ ์ ์์ ๋๋ฌํ๋ ๊ฒฝ์ฐ์ ์
ํ ๋ฒ์ ์ป์ ์ ์๋ ์ ์๊ฐ 3์ , 5์ , 10์ ์ด๋ผ๊ณ ํ ๋, ํน์ ์ ์์ ๋๋ฌํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
score(i-3) + score(i-5) + score(i-10) ๊ฐ์ ๋ํ์ฌ์ socre(i)์ ๊ฐ์ ๊ตฌํ ์ ์๋ค.
์ด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํํํ๋ฉด
def score(n):
if n<0:
return 0
elif n==0:
return 1
else:
return score(n-3)+score(n-5)+score(n-10)
์์ ๊ฐ์ด ํํํ ์ ์๋ค.
์ฌ๊ท ๋์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ํ์ ๋ฌธ์ ์ ๋ฐ๋ณต ๊ณ์ฐ์ ํผํ๋๋ก
def score(n):
dp=[0]*(n+1)
dp[0]=1
for i in range(1,n+1):
if i-3>=0:
dp[i]+=dp[i-3]
if i-5>=0:
dp[i]+=dp[i-5]
if i-10>=0:
dp[i]+=dp[i-10]
return dp
์ด์ฒ๋ผ ํํํ ์ ์๋ค.
์ฌ๊ท์์๋ 0๋ณด๋ค ๊ฐ์ ๊ฐ์ด๋ ์์ ๊ฐ์ด ๋ค์ด์ค๋ฉด ๋ฐ๋ก 0์ด๋ 1์ return ํด์ฃผ์๊ณ
DP์์๋ i๊ฐ์ด 3,5,10๋ณด๋ค ํฐ์ง ๋น๊ตํ์ฌ ๊ฐ ๊ฐ๋ณด๋ค ํฌ๋ฉด dp[i-3]์ ๋ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค.
8. ์ต๋ ์ฐ์ ๋ถ๋ถ ์์ด์ ํฉ
์ฐ์๋๋ ๋ถ๋ถ ์์ด์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ๋ถ๋ถ ์์ด์ ์ ํํ๋ ๋ฌธ์ ์ด๋ค.
naiveํ๊ฒ ์ ๊ทผํ๋ฉด ๋ชจ๋ ๋ถ๋ถ ์์ด์ ๊ฒฝ์ฐ๋ฅผ ํ์ํ์ฌ ์ต๋๊ฐ ๋๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์๋ค.
n=8
arr=[-2,-3,4,-1,-2,1,5,-3]
def maxsub():
temp=result=0
for i in range(n):
for j in range(i,n):
temp=0
for k in range(i,j+1):
temp+=arr[k]
result=max(temp,result)
return result
print(maxsub())
####->๋นํจ์จ์ ์ธ์ฝ๋
์ด๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ํ์ฌ ์์น๊น์ง์ ๋ถ๋ถ์์ด์ ํฉ์ ์ ํ๋ arr ๋ณ์๋ฅผ ๋ง๋ค์ด์ ์ด ๊ฐ์ด 0๋ณด๋ค ์์์ง๋ฉด ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ ์ ์์ผ๋ฏ๋ก arr ๋ณ์๋ฅผ 0 ๊ฐ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ฉด์ ํ์์ ์งํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
n-1๊น์ง for๋ฌธ์ ๋๋ฉด์ result ๊ฐ๊ณผ ํ์ฌ์ arr ๊ฐ์ ๋น๊ตํ์ฌ ๊ฐ์ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์ for๋ฌธ์ ๋น ์ ธ๋์จ ๋ค์ result ๊ฐ์ด ์ต๋ ์ฐ์ ๋ถ๋ถ ์์ด์ ํฉ์ด๋ค.
n=8
arr=[-2,-3,4,-1,-2,1,5,-3]
def maxsub():
curr=result=0
for i in range(n):
curr+=arr[i]
if curr<0:
curr=0
result=max(result,curr)
return result
print(maxsub())
'๐ปAlgorithm > ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ฆฌ๋(Greedy) - ์ต์์ ์ฅํธ๋ฆฌ(MST) (0) | 2022.04.18 |
---|---|
๊ทธ๋ฆฌ๋(Greedy)/ํ์ ๊ธฐ๋ฒ (0) | 2022.04.15 |
๋ถํ ์ ๋ณต(Divide and Conquer) - ์ต๊ทผ์ ์ ์ ์ ์ฐพ๊ธฐ (0) | 2022.04.11 |
๋ถํ ์ ๋ณต(Divide and Conquer) (0) | 2022.04.10 |