# 資料結構 & 演算法 / Java 解題筆記
**菜,就多練。所以我在練了。**
# 演算法 Algorism
## Dynamic Programming(DP,動態規劃)
### 1. UVa 12455 - Bars
> 2023/05/23 CPE - 第四題
題目:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3886
```java=
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int set = sc.nextInt();
while (set-- > 0) {
int target = sc.nextInt();
int num = sc.nextInt();
int[] bar = new int[num];
for (int i = 0; i < num; i++) {
bar[i] = sc.nextInt();
}
int[] dp = new int[target + 1];
for (int i = 0; i < num; i++) {
for (int j = target; j >= bar[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - bar[i]] + bar[i]);
}
}
if (dp[target] == target) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
sc.close();
}
}
```
## Breadth-First Search(BFS,廣度優先搜尋)
### 1. UVa 11518 - Dominos 2
> 2024/05/21 CPE - 第五題
題目:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2513
```java=
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int set = sc.nextInt();
while(set-- > 0) {
int n = sc.nextInt();
int m = sc.nextInt();
int l = sc.nextInt();
int[] flag = new int[n + 1];
ArrayList<ArrayList<Integer>> road = new ArrayList<>();
for (int i = 0; i <= n; i++) {
road.add(new ArrayList<>());
}
for (int i = 1; i <= m; i++) {
int from = sc.nextInt();
int to = sc.nextInt();
road.get(from).add(to);
}
int sum = 0;
for (int i = 0; i < l; i++) {
int from = sc.nextInt();
sum += bfs(from, flag, road);
}
System.out.println(sum);
}
sc.close();
}
static int bfs(int from, int[] flag, ArrayList<ArrayList<Integer>> road) {
int count = 0;
Queue<Integer> queue = new LinkedList<>();
queue.add(from);
while (!queue.isEmpty()) {
for (int i = 0; i < queue.size(); i++) {
int domino = queue.poll();
if (flag[domino] == 0) {
for (int j = 0; j < road.get(domino).size(); j++) {
queue.add(road.get(domino).get(j));
}
flag[domino] = 1;
count++;
}
}
}
return count;
}
}
```
## Depth-First Search(DFS,深度優先搜尋)
### 1. UVa 10858 - Unique Factorization
> 2024/05/21 CPE - 第四題
題目:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1799
```java=
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int num = sc.nextInt();
if (num == 0)
break;
ArrayList<ArrayList<Integer>> count = new ArrayList<>();
ArrayList<Integer> arr = new ArrayList<Integer>();
dfs(num, 2, count, arr);
if (!count.isEmpty()) {
count.remove(count.size() - 1);
}
System.out.println(count.size());
for (ArrayList<Integer> i : count) {
System.out.print(i.get(0));
for (int j = 1; j < i.size(); j++) {
System.out.print(" " + i.get(j));
}
System.out.println();
}
}
sc.close();
}
static void dfs(int num, int d, ArrayList<ArrayList<Integer>> count, ArrayList<Integer> arr) {
int bound = (int) Math.sqrt(num);
for (int i = d; i <= bound; i++) {
if (num % i == 0) {
arr.add(i);
dfs(num / i, i, count, arr);
arr.remove(arr.size() - 1);
}
}
arr.add(num);
count.add(new ArrayList<>(arr));
arr.remove(arr.size() - 1);
}
}
```
### 2. 樹狀圖分析 Tree Analyses
> 2017年10月 APCS - 第三題
題目:https://zerojudge.tw/ShowProblem?problemid=c463
```java=
```
# 資料結構 Data Structure
## Stack(堆疊)
### 1. UVa 00514 - Rails
> 題目:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=455
```java=
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int num = sc.nextInt();
if (num == 0)
break;
while (true) {
int[] sequence = new int[num];
sequence[0] = sc.nextInt();
if (sequence[0] == 0) {
System.out.println();
break;
}
for (int i = 1; i < num; i++) {
sequence[i] = sc.nextInt();
}
Stack<Integer> stack = new Stack<>();
int k = 0;
for (int i = 1; i <= num; i++) {
stack.push(i);
while (true) {
if (!stack.isEmpty() && stack.peek() == sequence[k]) {
stack.pop();
k++;
} else
break;
}
}
if (stack.isEmpty())
System.out.println("Yes");
else
System.out.println("No");
}
}
sc.close();
}
}
```