Problem
https://www.acmicpc.net/problem/10211
Summary
연속한 수열에서 최대 합을 찾는 문제 1 <= N <= 1000, -1000 <= arr[i] <= 1000
Idea
d[n] = max(d[n], d[n-1] + arr[n])
복잡도: O(n)
대략적으로 존재하는 부분 문제의 수 x 한 부분 문제를 풀 때 필요한 반복문의 수행 횟수
https://www.acmicpc.net/problem/10211
연속한 수열에서 최대 합을 찾는 문제 1 <= N <= 1000, -1000 <= arr[i] <= 1000
d[n] = max(d[n], d[n-1] + arr[n])
복잡도: O(n)
대략적으로 존재하는 부분 문제의 수 x 한 부분 문제를 풀 때 필요한 반복문의 수행 횟수
private static void combination(ArrayList<Integer> list, int n, int k) {
if (k == 0) {
System.out.println(list);
return;
}
int smallest = list.isEmpty() ? 0 : list.get(list.size() - 1) + 1;
for (int i = smallest; i < n; i++) {
list.add(i);
comb(list, n, k - 1);
list.remove(list.size() - 1);
}
}Similarly, there is a algorithm to generate all possible permutations of a list.
private static void permutaion(ArrayList<Integer> list, int n) {
if (list.size() == n) {
System.out.println(list);
return;
}
for (int i = 0; i < n; i++) {
if (visited[i] == false) {
visited[i] = true;
list.add(i);
permu(list, n);
list.remove(list.size() - 1);
visited[i] = false;
}
}
}https://www.acmicpc.net/problem/1256
https://www.acmicpc.net/problem/14502
void f(int a1, int a2, int a3) {
// base
if (a1+a2+a3 == n) {
if (visited[a1][a2][a3] == 0) {
//solution++;
}
visited[a1][a2][a3] = 1;
return;
}
f(a1+1, a2, a3);
f(a1, a2+1, a3);
f(a1, a2, a3+1);
}좀더 일반화를 해보자.
a+b+c=3 일 경우, 마지막 c는 a,b가 정해지면 알 수 있다.
a+b=3, a+b=2, a+b=1, a+b=0
a+b=3 은 다시
a=3, a=2, a=1, a=0 으로 분류
a1+a2+a3 …+ ak = n일 때 ( 0 <= ak <= n)
int f(int n, int k) {
// base
if (k == 1) {
return 1;
}
int solution = 0;
for (int i = 0; i <= n; i++) {
solution += f(n-i, k-1);
}
return solution;
}Below is just about everything you’ll need to style in the theme. Check the source code to see the many embedded elements within paragraphs.
Lorem ipsum dolor sit amet, test link adipiscing elit. This is strong. Nullam dignissim convallis est. Quisque aliquam. This is emphasized. Donec faucibus. Nunc iaculis suscipit dui. 53 = 125. Water is H2O. Nam sit amet sem. Aliquam libero nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Underline. Maecenas ornare tortor. Donec sed tellus eget COPY filename sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem, consequat at, Dinner’s at 5:00. commodo vitae, feugiat in, nunc. Morbi imperdiet augue mark element quis tellus.
Lorem ipsum dolor sit amet, test link adipiscing elit. Nullam dignissim convallis est. Quisque aliquam.
| Header1 | Header2 | Header3 |
|---|---|---|
| cell1 | cell2 | cell3 |
| cell4 | cell5 | cell6 |
| cell1 | cell2 | cell3 |
| cell4 | cell5 | cell6 |
| Foot1 | Foot2 | Foot3 |
#container {
float: left;
margin: 0 -240px 0 0;
width: 100%;
}
<div id="awesome">
<p>This is great isn't it?</p>
</div>
어떤게 최적인지 모를 때
1로 만들기 f(n): n을 세가지 연산(%3, %2, -1) 으로 1을 만드는 최소 횟수 큰수로 먼저 나누는게 이득인지 알 수 없다 f(n) = min(f(n%3) + 1, f(n%2) + 1, f(n-1) + 1)
동전교환 f(k): k을 만들기 위한 동전 n개의 최소개수
큰수로 먼저 빼는게 이득인지 알 수 없다
f(k) = f(k - coins[i]) + 1
붕어빵 판매하기 오르막 수 붕어빵 판매하기
큰수로 먼저 빼는게 이득인지 알 수 없다
f(n) = f(n - i^2) + 1
f(current, condition) ex: f(curr, previous path/opitons/count number so on…)
minimum sum (or tsp) 이전 지나온 길을 바탕으로 현재 길을 선택할 것이냐 말것이냐
색상환 (인접 조건) 현재 색을 고를 거냐 말거냐, 이전 선택한 수 (조건에 맞는) 상태변화 다음 색을 고를 경우, 이전 선택한 수 상태변화
RGB (인접 조건) R일 경우의 해는 이전 G/B의 경우에 따라 달라진다
기타 분할 마지막해 f(n) 과 이전 해 f(n-1) 의 관계/경우의 수 관계
장마가 찾아왔다
f(days, climbed) = days동안 climbed 기어올라올때까지의 확률 0.75 * f(days + 1, climbed + 1) + 0.25 * f(days + 1, clibmed + 2)
암호해독
원주율 외우기 f(begin) = min ( f(begin + i) + classify(begin, i)) i= 3,4,5 배수 길이 3 난이도 + 3글자 빼고 나머지 수열에 대한 최적해 길이 4 난이도 + 4글자 빼고 나머지 수열에 대한 최적해 ..
팰린드롬? 팰린드롬2?