今日学习内容
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
项目-派聪明
生活篇
晚上回学校上课.