5294 挖地雷

5294 挖地雷

 时间限制: 1 s

 空间限制: 1000 KB

 题目等级 : 黄金 Gold

题解

 查看运行结果

题目描述 Description

在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从第一个地窖开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入描述 Input Description

输入文件mine.in有若干行。

第1行只有一个数字,表示地窖的个数N。

第2行有N个数,分别表示每个地窖中的地雷个数。

第3行至第N+1行表示地窖之间的连接情况:

第3行有n-1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为1 1 0 0 0 … 0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

第4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

… …

第n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

输出描述 Output Description

输出文件wdl.out有两行数据。

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

样例输入 Sample Input

5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1

样例输出 Sample Output

1 3 4 5
27

数据范围及提示 Data Size & Hint

(N<=20)

 本题是一个经典的动态规划问题。很明显,题目规定所有路径都是单向的,所以满足无后效性原则和最优化原理。设W[i]为第i个地窖所藏有的地雷数,A[i][j]表示第i个地窖与第j个地窖之间是否有通路,F[i]为从第i个地窖开始最多可以挖出的地雷数,则有如下递归式:   F[i]=max{ W[i]+ F[j]} (i<j<=n , A[i][j]=true)   边界:F[n]=W[n]   于是就可以通过递推的方法,从后F(n)往前逐个找出所有的F[i],再从中找一个最大的即为问题2的解。对于具体所走的路径(问题1),可以通过一个向后的链接来实现。

最后一个点深坑

明明答案不唯一!!!!!!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 const int MAXN=21;
 6 int a[MAXN];
 7 int map[MAXN][MAXN];
 8 int f[MAXN];
 9 int pre[MAXN+5];
10 int pd;
11 int out(int x)
12 {
13     if(pre[x]!=x)
14     out(pre[x]);
15     printf("%d ",x);
16 }
17 int main()
18 {
19     int n;
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++)
22     scanf("%d",&a[i]);
23     for(int i=1;i<=n;i++)
24     f[i]=a[i];
25     pre[1]=1;
26     for(int i=1;i<=n-1;i++)
27     {
28         for(int j=i+1;j<=n;j++)
29         {
30             scanf("%d",&pd);
31             if(pd==1)map[i][j]=1;
32             else map[i][j]=0;
33         }
34     }
35     if(n==2&&map[1][2]==0)
36     {
37         printf("2\n%d",a[2]);
38         return 0;
39     }
40     for(int i=1;i<=n;i++)
41     {
42         for(int j=1;j<=n;j++)
43         {
44             if(map[i][j]==1)
45             {
46                 if(f[i]+a[j]>f[j])
47                 pre[j]=i;
48                 f[j]=max(f[i]+a[j],f[j]);
49                 
50             }
51         }
52     }
53     int ans=0;
54     int where;
55     for(int i=1;i<=n;i++)
56         if(f[i]>ans)ans=f[i],where=i;
57     out(where);
58     printf("\n");
59     printf("%d",ans);
60     return 0;
61 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

洛谷P4716 【模板】最小树形图(朱刘算法)

17410
来自专栏小灰灰

Greenrobot-EventBus源码学习(五)

EventBus 深入学习五之注册 订阅者的注册 + 消息推送 1. 注册 先贴出注册代码, 可以可到和 Guava 相比没什么大的区别, 主要的点在内部实...

24360
来自专栏ACM小冰成长之路

UVA-11600-Masud Rana

ACM模版 描述 ? ? 题解 image.png ? 保存六位小数…… 代码 #include <cstdio> #include <cstring> #in...

23260
来自专栏数据结构与算法

各种平衡树

记一下自己写的平衡树 方便以后复制粘贴 题目链接 Vector 最快:284ms 1 #include<cstdio> 2 #include<vector>...

29950
来自专栏数据结构与算法

Day4上午解题报告

预计分数:50 +0+0=50 实际分数:50+0+10=60 毒瘤出题人,T3不给暴力分 (*  ̄︿ ̄)  T1 https://www.luogu.org/...

28340
来自专栏Java呓语

观察者模式(触发联动)

目录: 1、举例:发起登录请求 2、Android Adapter 相关源代码分析 3、EventBus 相关源代码分析 4、观察者模式总结

21730
来自专栏拭心的安卓进阶之路

Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线

Go beyond yourself rather than beyond others. 上篇文章 深入理解 EventBus 3.0 之使用篇 我们了解了 ...

51550
来自专栏数据结构与算法

洛谷P1709 [USACO5.5]隐藏口令Hidden Password(最小表示法)

12530
来自专栏数据结构与算法

关于scanf与cin哪个快的问题

一开始入c++的时候成天跑cin,cout 直到有一天用cin,cout超时 才知道scanf比cin快的多 但是后来又听说加了ios::sync_with_s...

403120
来自专栏小灰灰

Greenrobot-EventBus源码学习(四)

EventBus 深入学习四之实例&类说明 本篇开始,则转向greenrobot/EventBus, 之前基本上将Guava中设计的思路捋了一遍,逻辑比较简...

45890

扫码关注云+社区

领取腾讯云代金券