题目描述

在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。

当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,

然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入描述

地窖个数N

每个地窖的地雷数

地窖之间的连通状态(0为不通,1为通)

输出描述

第一行 挖最多地雷的顺序,空格隔开

第二行 挖最多地雷的数量

题解

提高组水题

这道题有两个步骤

一、数量

用递推

定义前i个点能挖到的最大数量的地雷为f[i]

则f[i]=max(f[1],f[2],...f[i-1])+a[i](当然前提是连通)

所以答案就是f数组中的最大值

二、顺序

用hs数组记录哪个结点到i,能让f[i]最大

深搜查找总顺序

三、代码

#include<iostream>
using namespace std;
int n,a[55],sum,f[55],hs[55],ans;
bool map[55][55];
void dfs(int x){
if(x<=0) return ;
dfs(hs[x]);
cout<<x<<" ";
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
cin>>map[i][j];
for(int i=1;i<=n;i++){
f[i]=a[i];
for(int j=1;j<i;j++){
if(map[j][i]&&f[j]+a[i]>f[i]){
f[i]=f[j]+a[i];
hs[i]=j;
}
}
if(f[i]>sum){
sum=f[i];
ans=i;
}
}
dfs(hs[ans]);
cout<<ans<<endl;
cout<<sum;
return 0;
}

最新文章

  1. lintcode 最长上升连续子序列 II(二维最长上升连续序列)
  2. 【Alpha版本】冲刺-Day1
  3. 设置一个顺手的Xcode
  4. http://note.youdao.com/yws/public/redirect/share?id=2bc2dc6c7df6013e9f8106c005da999a&type=false
  5. 贪心 Gym 100502E Opening Ceremony
  6. SQL Server select 将类型相同的行合并,并将对应金额相加
  7. android电视安装爱奇艺等不能看视频问题
  8. What is the difference between &lt;%, &lt;%=, &lt;%# and -%&gt; in ERB in Rails?
  9. centos6.2下安装redis和phpredis扩展,亲测好用
  10. 2016年辛星less教程发布了
  11. android 中判断WiFi是否可用的可靠方法 ,android 是否联网
  12. 前端DES加密
  13. Java数据结构和算法 - TreeMap源码理解红黑树
  14. JVM远程调试功能
  15. GitHub搭配使用Travis CI 进行自动构建服务
  16. Mysql INSERT、REPLACE、UPDATE的区别
  17. 【BZOJ 3028】 3028: 食物 (生成函数)
  18. Guava CaseFormat
  19. app加密算法
  20. 程序设计分层思想和DAO设计模式的开发

热门文章

  1. AcWing 141 周期
  2. Shell命令-基础
  3. react零基础使用react-redux管理状态全过程(单组件)
  4. AttributeError: module &#39;openai&#39; has no attribute &#39;ChatCompletion&#39;的解决办法
  5. Mysql数据库基础第五章:(二)视图
  6. 基于线程的并行-Python 并行编程学习笔记(一)
  7. Bug的分类及优先级划分
  8. SSM整合【狂神说】
  9. Vuex 部分
  10. JAVA线段树模板