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