感谢大佬提供的思路,使用动态规划管理共15种状态,实际上每种状态的前置状态最多会有2种,理解了这一点状态转移方程就不难得出了
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void async function () { let n = +(await readline()) const bullon = (await readline()).split('').map(Number) const t = (await readline()).split(' ').map(Number) const dp = new Array(n + 1).fill().map(() => new Array(15).fill(Infinity)) // dp[i][j]表示把前i个气球染成状态j 所需的最少染色时间 // j共有15种状态 // dp[i][0]表示0, dp[i][1] - 1, dp[i][2] - 2 // dp[3] - 01 dp[4] - 02 dp[5] - 12 dp[6] - 10 dp[7] - 20 dp[8] - 21 // dp[9] - 012 dp[10] - 021 dp[11] - 102 dp[12] - 120 dp[13] - 201 dp[14] - 210 // dp数组总共15种状态 for(let i = 0; i < 3; i++) dp[0][i] = 0 for(let i = 1; i <= n; i++) { // 将第i个气球染成颜色0/1/2所需染色时间 const cost = new Array(3).fill(t[i - 1]) cost[bullon[i - 1]] = 0 // 若原本就为bullon[i-1],则染色时间为0 dp[i][0] = dp[i - 1][0] + cost[0] // 0 -> 0 dp[i][1] = dp[i - 1][1] + cost[1] // 1 -> 1 dp[i][2] = dp[i - 1][2] + cost[2] // 2 -> 2 // 有2个气球及以上才可能出现3-8的状态 if(i >= 2) { dp[i][3] = Math.min(dp[i - 1][0], dp[i - 1][3]) + cost[1] // 0/01 -> 01 dp[i][4] = Math.min(dp[i - 1][0], dp[i - 1][4]) + cost[2] // 0/02 -> 02 dp[i][5] = Math.min(dp[i - 1][1], dp[i - 1][5]) + cost[2] // 1/12 -> 12 dp[i][6] = Math.min(dp[i - 1][1], dp[i - 1][6]) + cost[0] // 1/10 -> 10 dp[i][7] = Math.min(dp[i - 1][2], dp[i - 1][7]) + cost[0] // 2/20 -> 20 dp[i][8] = Math.min(dp[i - 1][2], dp[i - 1][8]) + cost[1] // 2/21 -> 21 } // 有3个及以上气球才可能出现9-14的状态 if(i >= 3) { dp[i][9] = Math.min(dp[i - 1][3], dp[i - 1][9]) + cost[2] // 01/012 -> 012 dp[i][10] = Math.min(dp[i - 1][4], dp[i - 1][10]) + cost[1] // 02/021 -> 021 dp[i][11] = Math.min(dp[i - 1][6], dp[i - 1][11]) + cost[2] // 10/102 -> 102 dp[i][12] = Math.min(dp[i - 1][5], dp[i - 1][12]) + cost[0] // 12/120 -> 120 dp[i][13] = Math.min(dp[i - 1][7], dp[i - 1][13]) + cost[1] // 20/201 -> 201 dp[i][14] = Math.min(dp[i - 1][8], dp[i - 1][14]) + cost[0] // 21/210 -> 210 } } let res = Infinity for(let i = 0; i < 15; i++) { res = Math.min(dp[n][i], res) } console.log(res) }();