Skip to content

Commit dc00cc4

Browse files
committed
modify code
1 parent dd046ed commit dc00cc4

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

src/class47/Code01_StrangePrinter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ public static int strangePrinter1(String s) {
1111
return process1(str, 0, str.length - 1);
1212
}
1313

14+
// 要想刷出str[L...R]的样子!
15+
// 返回最少的转数
1416
public static int process1(char[] str, int L, int R) {
1517
if (L == R) {
1618
return 1;
1719
}
20+
// L...R
1821
int ans = R - L + 1;
1922
for (int k = L + 1; k <= R; k++) {
23+
// L...k-1 k....R
2024
ans = Math.min(ans, process1(str, L, k - 1) + process1(str, k, R) - (str[L] == str[k] ? 1 : 0));
2125
}
2226
return ans;

src/class47/Code02_RestoreWays.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,31 +62,53 @@ public static int ways1(int[] arr) {
6262
// 如果i位置的数字变成了v,
6363
// 并且arr[i]和arr[i+1]的关系为s,
6464
// s==0,代表arr[i] < arr[i+1] 右大
65-
// s==1,代表arr[i] == arr[i+1]
65+
// s==1,代表arr[i] == arr[i+1] 右=当前
6666
// s==2,代表arr[i] > arr[i+1] 右小
6767
// 返回0...i范围上有多少种有效的转化方式?
6868
public static int process1(int[] arr, int i, int v, int s) {
6969
if (i == 0) { // 0...i 只剩一个数了,0...0
70-
return ((s == 0 || s == 1) && (arr[i] == 0 || v == arr[i])) ? 1 : 0;
70+
return ((s == 0 || s == 1) && (arr[0] == 0 || v == arr[0])) ? 1 : 0;
7171
}
7272
// i > 0
7373
if (arr[i] != 0 && v != arr[i]) {
7474
return 0;
7575
}
76-
// i>0 并且 i位置的数真的可以变成V,
76+
// i>0 ,并且, i位置的数真的可以变成V,
7777
int ways = 0;
78-
if (s == 0 || s == 1) { // [i - 1] [i] <=
78+
if (s == 0 || s == 1) { // [i] -> V <= [i+1]
7979
for (int pre = 1; pre < 201; pre++) {
8080
ways += process1(arr, i - 1, pre, pre < v ? 0 : (pre == v ? 1 : 2));
8181
}
82-
} else { // s == 2 i > 右 i-1 >= i > 右
82+
} else { // ? 当前 > 右 当前 <= max{左,右}
8383
for (int pre = v; pre < 201; pre++) {
8484
ways += process1(arr, i - 1, pre, pre == v ? 1 : 2);
8585
}
8686
}
8787
return ways;
8888
}
8989

90+
public static int zuo(int[] arr, int i, int v, int s) {
91+
if (i == 0) { // 0...i 只剩一个数了,0...0
92+
return ((s == 0 || s == 1) && (arr[0] == 0 || v == arr[0])) ? 1 : 0;
93+
}
94+
// i > 0
95+
if (arr[i] != 0 && v != arr[i]) {
96+
return 0;
97+
}
98+
// i>0 ,并且, i位置的数真的可以变成V,
99+
int ways = 0;
100+
if (s == 0 || s == 1) { // [i] -> V <= [i+1]
101+
for (int pre = 1; pre < v; pre++) {
102+
ways += zuo(arr, i - 1, pre, 0);
103+
}
104+
}
105+
ways += zuo(arr, i - 1, v, 1);
106+
for (int pre = v + 1; pre < 201; pre++) {
107+
ways += zuo(arr, i - 1, pre, 2);
108+
}
109+
return ways;
110+
}
111+
90112
public static int ways2(int[] arr) {
91113
int N = arr.length;
92114
int[][][] dp = new int[N][201][3];

src/class47/Code03_DinicAlgorithm.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ private boolean bfs(int s, int t) {
6767
boolean[] visited = new boolean[N];
6868
visited[s] = true;
6969
while (!queue.isEmpty()) {
70+
// u是当前节点
7071
int u = queue.pollLast();
7172
for (int i = 0; i < nexts.get(u).size(); i++) {
7273
Edge e = edges.get(nexts.get(u).get(i));
@@ -81,12 +82,17 @@ private boolean bfs(int s, int t) {
8182
return visited[t];
8283
}
8384

85+
// 当前来到了s点,s可变
86+
// 最终目标是t,t固定参数
87+
// r,收到的任务
88+
// 收集到的流,作为结果返回,ans <= r
8489
private int dfs(int s, int t, int r) {
8590
if (s == t || r == 0) {
8691
return r;
8792
}
8893
int f = 0;
8994
int flow = 0;
95+
// s点从哪条边开始试 -> cur[s]
9096
for (; cur[s] < nexts.get(s).size(); cur[s]++) {
9197
int ei = nexts.get(s).get(cur[s]);
9298
Edge e = edges.get(ei);

0 commit comments

Comments
 (0)