第一行输入一个整数
代表气球数量。
第二行输入一个长度为
的、仅由
构成的字符串代表气球的初始颜色。其中,
分别代表初始颜色为红、黄、蓝。
第三行输入
个整数
代表气球重新染色需要的时间。
在一行上输出一个整数,代表最少需要的染色时间。
5 00000 1 2 3 4 5
0
由于初始时全部气球颜色都是一样的,所以不需要重新进行染色。
6 210102 1 1 4 5 1 4
3
其中一种最优的染色方案是将气球染色为
,花费
。
6 001012 1 1 4 5 1 4
3
其中一种最优的染色方案是将气球染色为
,花费
。
import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String s = in.next();
int[] costs = new int[n];
for (int i = 0; i < n; i++) {
costs[i] = in.nextInt();
}
// 0 :全红、形如000
// 1 :全黄、形如111
// 2 :全蓝、形如222
// 3 :黄红、形如10
// 4 :蓝黄、形如21
// 5 :红蓝、形如02
// 6 :蓝红、形如20
// 7 :红黄、形如01
// 8 :黄蓝、形如12
// 9 :黄蓝红、形如120
// 10 :红蓝黄、形如021
// 11 :黄红蓝、形如102
// 12 :蓝黄红、形如210
// 13 :蓝红黄、形如201
// 14 :红黄蓝、形如012
int[] t = new int[3]; //t[0]、t[1]、t[2]分别表示更改为红黄蓝颜色需要花费的时间
long[] dp = new long[15]; //表示更改为对应的颜色类型需要花费的最少时间
for (int i = 0; i < s.length(); i++) {
t[0] = t[1] = t[2] = costs[i];
t[s.charAt(i) - '0'] = 0; //改为当前颜色的花费为0
dp[14] = Math.min(dp[14], dp[7]) + t[2]; //红黄蓝只能由红黄蓝本身以及红黄变过来
dp[13] = Math.min(dp[13], dp[6]) + t[1];
dp[12] = Math.min(dp[12], dp[4]) + t[0];
dp[11] = Math.min(dp[11], dp[3]) + t[2];
dp[10] = Math.min(dp[10], dp[5]) + t[1];
dp[9] = Math.min(dp[9], dp[8]) + t[0];
dp[8] = Math.min(dp[8], dp[1]) + t[2];
dp[7] = Math.min(dp[7], dp[0]) + t[1];
dp[6] = Math.min(dp[6], dp[2]) + t[0];
dp[5] = Math.min(dp[5], dp[0]) + t[2];
dp[4] = Math.min(dp[4], dp[2]) + t[1];
dp[3] = Math.min(dp[3], dp[1]) + t[0];
dp[2] += t[2];
dp[1] += t[1];
dp[0] += t[0];
}
long minV = Long.MAX_VALUE;
for (int i = 0; i < 15; i++) {
minV = Math.min(minV, dp[i]);
}
System.out.println(minV);
}
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2 * 1e5 + 100;
const long long M = 2 * 1e12 + 100;
int main() {
int n;
string str;
vector<int> t(N);
cin >> n >> str;
str = "?" + str;
for (int i = 1; i <= n; i++) {
cin >> t[i];
}
vector<vector<vector<long long>>> dp(N, vector<vector<long long>>(3, vector<long long>(8, M)));
for (int j = 0; j < 3; j++) {
dp[1][j][1 << j] = str[1] - '0' == j ? 0 : t[1];
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j < 3; j++) {
for (int mask = 0; mask < 8; mask++) {
if (mask >> j & 1) { // 第 i 个气球的颜色为 j,mask含 j
dp[i][j][mask] = min(dp[i][j][mask], dp[i - 1][j][mask] + (str[i] - '0' == j ? 0 : t[i]));
}
else { // 第 i 个气球的颜色为 j,mask不含 j,找出第 i-1 个气球所有符合条件的情况,用dp[i - 1][k][mask]推其他值。因为mask不含 j,故其他值是dp[i][j][mask | (1 << j)]
for (int k = 0; k < 3; k++) {
if (mask >> k & 1 && k != j) {
dp[i][j][mask | (1 << j)] = min(dp[i][j][mask | (1 << j)], dp[i - 1][k][mask] + (str[i] - '0' == j ? 0 : t[i]));
}
}
}
}
}
}
} #时间对比中相对论
import sys
n = int(sys.stdin.readline()) # 任务数量
colors = sys.stdin.readline().strip() # 每个任务的颜色
times = list(map(int, sys.stdin.readline().split())) # 每个任务的处理时间
total = sum(times) # 总处理时间
permutations = [
('0', '1', '2'), ('0', '2', '1'),
('1', '0', '2'), ('1', '2', '0'),
('2', '0', '1'), ('2', '1', '0'),
] #permutations:排列;序列
# 所有可能的颜色排列(处理器处理颜色的顺序)
min_cost = float('inf')
for perm in permutations:
a, b, c = perm
dp0 = 0 # 处理器A的初始负载
dp1 = -float('inf') # 处理器B的初始负载(尚未开始处理)
dp2 = -float('inf') # 处理器C的初始负载(尚未开始处理)
for i in range(n):
current_color = colors[i] #每个任务的颜色
t = times[i]
if current_color == a:
new_dp0 = dp0 + t
new_dp1 = dp1
new_dp2 = dp2
elif current_color == b:
new_dp0 = dp0
new_dp1 = max(dp1 + (t if dp1 != -float('inf') else 0), dp0 + t)
new_dp2 = dp2
else:
new_dp0 = dp0
new_dp1 = dp1
new_dp2 = max(dp2 + (t if dp2 != -float('inf') else 0), dp1 + t)
dp0, dp1, dp2 = new_dp0, new_dp1, new_dp2
# 计算当前排列下的最大负载
current_max = max(dp0, dp1 if dp1 != -float('inf') else 0, dp2 if dp2 != -float('inf') else 0)
current_cost = total - current_max # 目标是最小化这个值
if current_cost < min_cost:
min_cost = current_cost
print(min_cost)
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int total = Integer.valueOf(in.nextLine());
String str = in.nextLine();
int[] weight = new int[total];
for (int i = 0; i < total; i++) {
weight[i] = in.nextInt();
}
if (str.matches("[0]+") || str.matches("[1]+") || str.matches("[2]+")) {
System.out.println(0);
return;
}
int result = -1;
for (int i = 1; i < total; i++) {
for (int j = i + 1; j < total; j++) {
int result1 = dfs(str, 0, i, weight);
int result2 = dfs(str, i, j, weight);
int result3 = dfs(str, j, total, weight);
int sum = result1 + result2 + result3;
result = result == -1 ? sum : Math.min(result, sum);
}
}
System.out.println(result);
}
static Map<String, Integer> map = new LinkedHashMap<>();
public static int dfs(String input, int x, int y, int[] weight) {
if (map.containsKey(x + ":" + y)) {
return map.get(x + ":" + y);
}
int result0 = 0;
int result1 = 0;
int result2 = 0;
for (int i = x; i < y; i++) {
char ch = input.charAt(i);
// 改成0
if (ch != '0') {
result0 += weight[i];
}
// 改成1
if (ch != '1') {
result1 += weight[i];
}
// 改成2
if (ch != '2') {
result2 += weight[i];
}
}
int min = Math.min(Math.min(result0, result1), result2);
map.put(x + ":" + y, min);
return min;
}