力扣双周赛56场(上)

144 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

1925. 统计平方和三元组的数目

截屏2021-08-04 下午10.11.29.png

思路分析

作为第一题,并没有使用一次循环,不过依旧是简单的三次循环遍历。

不过穷举的基础上,我们还是可以尽力剪枝的,比如说根据交换法a+b = b+a,所以除非a == b 否则我们计算出(a,b,c)时,一定可以反推(b,a,c)的,因此有:

 if ( i * i + j * j == k*k){
    if (i != j) ret ++;
    ret ++;
}

规定时间内到达终点的最小花费

截屏2021-08-04 下午11.08.27.png

思路分析

问题是:完成旅行的最小费用(如果没有完成,就返回-1)。

题干中给了我们maxtime和城市的权重(费用),如果是求最少权重或者最短旅行时间,相信各位已经很熟练了,但是在众多合法旅行时间中选出最少权重,这就让只会背背模板的人束手无策了。

那么这道题可以换种思路,由于合法的旅行时间终究是有限的。

所以我们可以分类讨论,即时间为x的前提下,最小费用是多少?

我们可以使用动态规划解决问题:

这里毛遂自荐下我的动态规划的专栏

回顾下之前讲的状态表示部分,来使我们轻松的写出状态转移方程。

状态表示

状态表示就是状态是什么,即dp[i][j]代表了满足条件i和满足条件j的最大/最小/的和

dp[i][j] 代表满足时间==i和到达第j个城市的最小权重。

那么dp[i][j]要怎么获取呢?

可以根据路径检索,假设存在a城市到j城市的路径所需时间为x,j城市权重为k

那么有

dp[i][j] = dp[i - x][a]+k

有多条路径就取最小值就可以了。