Skip to content

Commit 2eda669

Browse files
committed
Improved tasks 3332 and 3337
1 parent 5f127d8 commit 2eda669

File tree

2 files changed

+80
-82
lines changed
  • src/main/kotlin/g3301_3400
    • s3332_maximum_points_tourist_can_earn
    • s3337_total_characters_in_string_after_transformations_ii

2 files changed

+80
-82
lines changed
Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,27 @@
11
package g3301_3400.s3332_maximum_points_tourist_can_earn
22

33
// #Medium #Array #Dynamic_Programming #Matrix
4-
// #2024_10_29_Time_387_ms_(100.00%)_Space_68.8_MB_(47.37%)
4+
// #2024_10_29_Time_216_ms_(100.00%)_Space_64_MB_(78.95%)
55

66
import kotlin.math.max
77

88
class Solution {
9-
var days: Int = 0
10-
var cities: Int = 0
11-
lateinit var dp: Array<Array<Int?>?>
12-
13-
private fun f(day: Int, city: Int, stayScore: Array<IntArray>, travelScore: Array<IntArray>): Int {
14-
if (day == days) {
15-
return 0
16-
}
17-
if (dp[day]!![city] != null) {
18-
return dp[day]!![city]!!
19-
}
20-
var maxScore = 0
21-
for (desCity in 0 until cities) {
22-
var score: Int
23-
if (desCity == city) {
24-
score = stayScore[day][city]
25-
} else {
26-
score = travelScore[city][desCity]
9+
fun maxScore(n: Int, k: Int, stayScores: Array<IntArray>, travelScores: Array<IntArray>): Int {
10+
// dp[day][city]
11+
val dp = Array<IntArray?>(k + 1) { IntArray(n) }
12+
var result = 0
13+
for (day in k - 1 downTo 0) {
14+
for (city in 0 until n) {
15+
val stayScore = stayScores[day][city] + dp[day + 1]!![city]
16+
var travelScore = 0
17+
for (nextCity in 0 until n) {
18+
val nextScore = travelScores[city][nextCity] + dp[day + 1]!![nextCity]
19+
travelScore = max(nextScore, travelScore)
20+
}
21+
dp[day]!![city] = max(stayScore, travelScore)
22+
result = max(dp[day]!![city], result)
2723
}
28-
maxScore = max(maxScore, (score + f(day + 1, desCity, stayScore, travelScore)))
29-
}
30-
dp[day]!![city] = maxScore
31-
return dp[day]!![city]!!
32-
}
33-
34-
fun maxScore(n: Int, k: Int, stayScore: Array<IntArray>, travelScore: Array<IntArray>): Int {
35-
days = k
36-
cities = n
37-
var maxScore = 0
38-
dp = Array<Array<Int?>?>(days + 1) { arrayOfNulls<Int>(cities + 1) }
39-
for (city in 0 until cities) {
40-
maxScore = max(maxScore, f(0, city, stayScore, travelScore))
4124
}
42-
return maxScore
25+
return result
4326
}
4427
}
Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,90 @@
11
package g3301_3400.s3337_total_characters_in_string_after_transformations_ii
22

33
// #Hard #String #Hash_Table #Dynamic_Programming #Math #Counting
4-
// #2024_10_29_Time_581_ms_(33.33%)_Space_57.4_MB_(33.33%)
4+
// #2024_10_29_Time_320_ms_(100.00%)_Space_44_MB_(33.33%)
55

66
class Solution {
77
fun lengthAfterTransformations(s: String, t: Int, nums: List<Int>): Int {
8-
// Initialize transformation matrix M
9-
val matrix = Array<IntArray?>(ALPHABET_SIZE) { IntArray(ALPHABET_SIZE) }
10-
for (i in 0 until ALPHABET_SIZE) {
11-
val transforms: Int = nums[i]
12-
for (j in 0 until transforms) {
13-
matrix[i]!![(i + j + 1) % ALPHABET_SIZE] =
14-
matrix[i]!![(i + j + 1) % ALPHABET_SIZE] + 1
8+
val m = Array<IntArray?>(26) { IntArray(26) }
9+
for (i in 0..25) {
10+
for (j in 1..nums[i]) {
11+
m[(i + j) % 26]!![i] = m[(i + j) % 26]!![i] + 1
1512
}
1613
}
17-
// Initialize count array based on string `s`
18-
val count = IntArray(ALPHABET_SIZE)
19-
for (ch in s.toCharArray()) {
20-
count[ch.code - 'a'.code]++
14+
var v = IntArray(26)
15+
for (c in s.toCharArray()) {
16+
v[c.code - 'a'.code]++
2117
}
22-
// Apply matrix exponentiation to get M^t
23-
val matrixT = power(matrix, t)
24-
// Calculate final character counts after t transformations
25-
val finalCount = IntArray(ALPHABET_SIZE)
26-
for (i in 0 until ALPHABET_SIZE) {
27-
for (j in 0 until ALPHABET_SIZE) {
28-
finalCount[j] = ((finalCount[j] + (matrixT[i]!![j].toLong() * count[i]) % MOD) % MOD).toInt()
18+
v = pow(m, v, t.toLong())
19+
var ans: Long = 0
20+
for (x in v) {
21+
ans += x.toLong()
22+
}
23+
return (ans % MOD).toInt()
24+
}
25+
26+
// A^e*v
27+
private fun pow(a: Array<IntArray?>, v: IntArray, e: Long): IntArray {
28+
var v = v
29+
var e = e
30+
for (i in v.indices) {
31+
if (v[i] >= MOD) {
32+
v[i] %= MOD
2933
}
3034
}
31-
// Calculate total length
32-
var totalLength = 0
33-
for (cnt in finalCount) {
34-
totalLength = (totalLength + cnt) % MOD
35+
var mul = a
36+
while (e > 0) {
37+
if ((e and 1L) == 1L) {
38+
v = mul(mul, v)
39+
}
40+
mul = p2(mul)
41+
e = e ushr 1
3542
}
36-
return totalLength
43+
return v
3744
}
3845

39-
// Matrix multiplication function
40-
private fun multiply(a: Array<IntArray?>, b: Array<IntArray?>): Array<IntArray?> {
41-
val matrixC = Array<IntArray?>(ALPHABET_SIZE) { IntArray(ALPHABET_SIZE) }
42-
for (i in 0 until ALPHABET_SIZE) {
43-
for (j in 0 until ALPHABET_SIZE) {
44-
for (k in 0 until ALPHABET_SIZE) {
45-
matrixC[i]!![j] = ((matrixC[i]!![j] + (a[i]!![k].toLong() * b[k]!![j]) % MOD) % MOD).toInt()
46+
// int matrix*int vector
47+
private fun mul(a: Array<IntArray?>, v: IntArray): IntArray {
48+
val m = a.size
49+
val n = v.size
50+
val w = IntArray(m)
51+
for (i in 0 until m) {
52+
var sum: Long = 0
53+
for (k in 0 until n) {
54+
sum += a[i]!![k].toLong() * v[k]
55+
if (sum >= BIG) {
56+
sum -= BIG
4657
}
4758
}
59+
w[i] = (sum % MOD).toInt()
4860
}
49-
return matrixC
61+
return w
5062
}
5163

52-
// Matrix exponentiation function
53-
private fun power(matrix: Array<IntArray?>, exp: Int): Array<IntArray?> {
54-
var matrix = matrix
55-
var exp = exp
56-
var result = Array<IntArray?>(ALPHABET_SIZE) { IntArray(ALPHABET_SIZE) }
57-
for (i in 0 until ALPHABET_SIZE) {
58-
// Identity matrix
59-
result[i]!![i] = 1
60-
}
61-
while (exp > 0) {
62-
if (exp % 2 == 1) {
63-
result = multiply(result, matrix)
64+
// int matrix^2 (be careful about negative value)
65+
private fun p2(a: Array<IntArray?>): Array<IntArray?> {
66+
val n = a.size
67+
val c = Array<IntArray?>(n) { IntArray(n) }
68+
for (i in 0 until n) {
69+
val sum = LongArray(n)
70+
for (k in 0 until n) {
71+
for (j in 0 until n) {
72+
sum[j] += a[i]!![k].toLong() * a[k]!![j]
73+
if (sum[j] >= BIG) {
74+
sum[j] -= BIG
75+
}
76+
}
77+
}
78+
for (j in 0 until n) {
79+
c[i]!![j] = (sum[j] % MOD).toInt()
6480
}
65-
matrix = multiply(matrix, matrix)
66-
exp /= 2
6781
}
68-
return result
82+
return c
6983
}
7084

7185
companion object {
72-
private const val MOD = 1000000007
73-
private const val ALPHABET_SIZE = 26
86+
const val MOD: Int = 1000000007
87+
const val M2: Long = MOD.toLong() * MOD
88+
const val BIG: Long = 8L * M2
7489
}
7590
}

0 commit comments

Comments
 (0)