今日学习内容

3DGS

力扣每日一题

三角形最小得分
今天的每日可以想到原问题可以转变成相同的子问题,想到了用记忆化搜索来做.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int minScoreTriangulation(int[] values) {
//原问题可以转换成更小的子问题 贪心的拆分为最小
int n = values.length;
int[][] memo = new int[n][n];
for(int[] row:memo){
Arrays.fill(row,-1);
}
return dfs(0, n-1, values, memo);
}
private int dfs(int i , int j , int[] v, int[][] memo){
if(i + 1 == j){
return 0;
}
if(memo[i][j] != -1){
return memo[i][j];
}
int res = Integer.MAX_VALUE;
for(int k = i + 1 ; k < j ; ++k){
int subRes = dfs(i,k,v,memo) + dfs(k,j,v,memo) + v[i] * v[j] * v[k] ;
res = Math.min(subRes,res);
}
return memo[i][j] = res;
}

一比一翻译成为递推,值得注意的就是循环的方向.
由于k比i大,为了保证i最后被传递,所以i要从大到小遍历.
由于k比j小,为了保证j最后被传递,所以j要从小到大遍历.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int minScoreTriangulation(int[] v) {
//原问题可以转换成更小的子问题 贪心的拆分为最小
int n = v.length;
int[][] f = new int[n][n];
for(int i = n - 3 ; i >= 0 ; --i){
for(int j = i + 2 ; j < n ; ++j){
f[i][j] = Integer.MAX_VALUE;
for(int k = i + 1 ; k < j ; ++k){
f[i][j] = Math.min(f[i][j] , f[i][k] + f[k][j] + v[i] * v[j] * v[k]);
}
}
}
return f[0][n-1];
}

Java复习进度

Java SE
0->56/56
Java集合框架
0->30/30
Java并发编程
14/71
JVM
MySQL
55/83
Redis
14/57
Spring
0/41
操作系统
计算机网络
MyBatis
RocketMQ
分布式
微服务
设计模式
Linux

算法

上午做了两道单调栈

简历制作

项目-TecHub

项目-派聪明

生活篇

晚上回学校上课.