在一个地图上有 nn 个地窖(n\le 20n≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入格式
第一行一个整数 nn,代表地窖的个数。
第二行 nn 个整数,代表每个地窖的地雷个数。
然后 n-1n−1 行中的第 ii 行有 n-in−i 个整数,其中的第 jj 个整数代表第 ii 个地窖和 i+ji+j 的连接关系,为 11 表示相连,00 表示不相连。
输出格式
第一行是挖地雷的顺序,两个相邻的格子用-
隔开,第二行是挖地雷的最大数量。
Sample Input
3 10 20 5 0 1 0
Sample Output
2 20
我也不知道我写了个什么 直接枚举
#include <iostream>
#include <vector>
#include <cmath>
#include <stack>
using namespace std;
int num[21],n,net[21][21],path[21],result[21];
int cal()
{
int Max = num[1],end = 1;
result[1] = num[1];
path[1] = 0;
for(int i = 2;i <= n;i++){
result[i] = num[i];
for(int j = 1;j < i;j++){
if(net[j][i] > 0 && result[i] < result[j] + num[i]){
result[i] = result[j] + num[j];
path[i] = j;
}
if(result[i] > Max){
end = i;
Max = result[i];
}
}
}
return end;
}
void print(int end)
{
stack<int> st;
int t = end,sum;
st.push(end);
while(path[t] != 0){
st.push(path[t]);
t = path[t];
}
cout << st.top();
sum += num[st.top()];
st.pop();
while(!st.empty()){
cout << "-" << st.top();
sum += num[st.top()];
st.pop();
}
cout << "\n" << sum;
}
int main()
{
int f;
cin >> n;
for(int i = 1;i <= n;i++)
cin >> num[i];
for(int i = 1;i < n;i++){
for(int j = i+1;j <= n;j++){
cin >> f;
net[i][j] = f;
}
}
int e = cal();
print(e);
return 0;
}
放一个dfs
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30;
int n, m[maxn][maxn], vis[maxn];
int a[maxn], ans[maxn], now[maxn];
//now暂存,ans更新!
int tmp, cnt;
void dfs(int x, int value, int step) {
now[step] = x;
if (value > tmp) {
for (int i = 1; i <= step; i++)
ans[i] = now[i];
tmp = value;
cnt = step;
}
vis[x] = 1;
for (int i = 1; i <= n; i++) {
if (m[x][i] && vis[i] == 0) {
dfs(i, value + a[i], step + 1);
vis[i] = 0;
}
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d",&a[i]);
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int tt;
scanf("%d", &tt);
if (tt == 1) m[i][j] = 1;
}
}
for (int i = 1; i <= n; i++) {
memset(vis, 0, sizeof(vis));
dfs(i, a[i], 1);
}
printf("%d", ans[1]);
for (int i = 2; i <= cnt; i++)
printf("-%d", ans[i]);
printf("\n%d\n", tmp);
}