解析代码 // 答案 9 12 16 /*动态规划*/ #include <iostream> #include <cstring> using namespace std; const int N = 3, M = 7; // 利润 int w[N + 1][M] = { {0, 0, 0, 0, 0, 0, 0}, {0, 3, 5, 6, 7, 6, 5}, {0, 4, 6, 7, 8, 9, 10}, {0, 2, 5, 9, 8, 8, 7}, }; int f[N + 1][M][M]; int main() { // 初始化 memset(f, -0x3f, sizeof f); f[0][0][0] = 0; // 动态规划 for (int i = 1; i <= N; i++) for (int j = 0; j <= 6; j++) for (int k = 0; k <= 6; k++) for (int l = 0; l <= j; l++) f[i][j][k] = max(f[i][j][k], f[i-1][k][l] + w[i][j-l]); // 求解答案 int res = 0; for (int i = 0; i <= 6; i++) for (int j = 0; j <= 6; j++) res = max(res, f[N][i][j]); cout << res << endl; return 0; } ///*贪心*/ ///*回溯*/ ///*分支限界*/
时间: 2024-04-28 18:26:11 浏览: 66
这段代码实现了动态规划的解法。下面是代码的解析:
1. 利用三维数组 f 存储状态,其中 $f[i][j][k]$ 表示前 $i$ 个分厂中第 $i$ 个分厂选择 $j$ 套设备,第 $i-1$ 个分厂选择 $k$ 套设备时的最大收益。
2. 初始化 f 数组,将其全部赋值为 -0x3f,表示其还未被访问到,这样可以避免一些边界问题,同时将 f[0][0][0] 赋值为 0。
3. 通过三层循环,枚举前 $i$ 个分厂、第 $i$ 个分厂选择的设备套数 $j$、第 $i-1$ 个分厂选择的设备套数 $k$ 和 $j$ 中的某个值 $l$,根据状态转移方程 $f[i][j][k] = max\{f[i-1][k][l] + w[i][j-l]\}$ 更新 f 数组。
4. 最终答案为 f[N][i][j] 中的最大值,其中 N 表示分厂的个数,即为 3。
5. 代码中注释掉了其他三种算法的实现,包括贪心、回溯和分支限界算法。
总体来说,该代码实现了动态规划算法解决这个问题,时间复杂度为 $O(NM^3)$,其中 N 和 M 分别表示分厂和设备的数量。
相关问题
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main(int argc, const char * argv[]) { char s[1001]; int a[1001]; int k; int n; // 请在这里补充代码,完成本关任务 /********* Begin *********/ /********* End *********/ return 0; }
这段代码的功能是从一个字符串中删除k个数字,使得剩下的数字组成的数最大。现在需要你在代码的注释中实现删除k个数字的功能。下面是你需要添加的代码注释:
```c++
// 请在这里补充代码,完成本关任务
// 将s中的前n-k个数字删除,使得剩下的数字组成的数最大
// a数组记录每个数字的位置,方便后面删除数字
// 每次删除比后面数字小的数字
/********* Begin *********/
n = strlen(s);
for (int i = 0; i < n; i++) {
a[i] = i;
}
for (int i = 0; i < n - k; i++) {
int pos = i;
for (int j = i + 1; j < n; j++) {
if (s[j] > s[pos]) {
pos = j;
}
}
for (int j = pos; j > i; j--) {
swap(s[j], s[j - 1]);
swap(a[j], a[j - 1]);
}
}
s[n - k] = '\0';
sort(a + n - k, a + n);
for (int i = n - k + 1; i < n; i++) {
s[a[i]] = '\0';
}
/********* End *********/
```
将下面的c语言代码转化为java代码:#include <iostream> #include <cstring> #include<cmath> #include<stdio.h> #include<map> using namespace std; //词典结构 struct S { char des[15]; //目标语言 char src[15]; //英语 }dic[100010]; //定义比较器,目标语言字典序升序排列 int cmp(const void *a, const voi
Java代码如下:
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
//词典结构
static class S {
String des; //目标语言
String src; //英语
}
static S[] dic = new S[100010];
//定义比较器,目标语言字典序升序排列
static class MyComparator implements Comparator<S> {
public int compare(S s1, S s2) {
return s1.des.compareTo(s2.des);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Map<String, String> map = new HashMap<String, String>();
int cnt = 0;
while (scanner.hasNext()) {
String src = scanner.next();
String des = scanner.next();
dic[cnt] = new S();
dic[cnt].des = des;
dic[cnt].src = src;
cnt++;
}
scanner.close();
//按目标语言字典序升序排列
Arrays.sort(dic, 0, cnt, new MyComparator());
//构建映射表
for (int i = 0; i < cnt; i++) {
map.put(dic[i].des, dic[i].src);
}
//查询并输出翻译结果
while (scanner.hasNext()) {
String word = scanner.next();
if (map.containsKey(word)) {
System.out.println(map.get(word));
} else {
System.out.println("eh");
}
}
}
}
阅读全文