[LUOGU] P2196 挖地雷
2024-09-29 22:55:29
题目背景
NOIp1996提高组第三题
题目描述
在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入输出格式
输入格式:
输入文件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表示有路径)。
输出格式:
输出文件wdl.out有两行数据。
第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。
第二行只有一个数,表示能挖到的最多地雷数。
输入输出样例
输入样例#1: 复制
5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1
输出样例#1: 复制
1 3 4 5
27
数据很小,可以用一用 生疏的 DFS做,也是很快的。
既然数据小,邻接矩阵完全可行。
答案输出就是一个链表。
//Writer:GhostCai && His Yellow Duck
#include<iostream>
using namespace std;
const int MAXN=25;
int link[MAXN][MAXN];
int w[MAXN];
int n;
int son[MAXN];
int dfs(int id){
int ans=0,ansid=id,tmp;
for(int i=1;i<=n;i++){
if(link[id][i]&&i>id){
tmp=dfs(i);
if(tmp>ans){
ans=tmp;
ansid=i;
son[id]=i;
}
}
}
return ans+w[id];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
cin>>link[i][j];
}
}
int ans=0,ansid;
for(int i=1;i<=n;i++){
int tmp=dfs(i);
if(tmp>ans){
ans=tmp;
ansid=i;
}
}
while(ansid){
cout<<ansid<<" ";
ansid=son[ansid];
}
cout<<endl<<ans<<endl;
}
正解当然是DP,就是一个DAG
注意每步比上步序号大。
//Writer:GhostCai && His Yellow Duck
#include<iostream>
using namespace std;
const int MAXN=25;
int link[MAXN][MAXN];
int f[MAXN];
int w[MAXN];
int n;
int son[MAXN];
int dfs(int id){
int ans=0,ansid=id,tmp;
for(int i=1;i<=n;i++){
if(link[id][i]&&i>id){
tmp=dfs(i);
if(tmp>ans){
ans=tmp;
ansid=i;
son[id]=i;
}
}
}
return ans+w[id];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i],f[i]=w[i];
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
cin>>link[i][j];
}
}
for(int i=n;i>=1;i--){
for(int j=i+1;j<=n;j++){
if(link[i][j]&&f[j]+w[i]>f[i]){
f[i]=f[j]+w[i];//!!w[j]
son[i]=j;
}
}
}
int ans=0,ansid;
for(int i=1;i<=n;i++){
if(f[i]>ans){
ans=f[i];
ansid=i;
}
}
while(ansid){
cout<<ansid<<" ";
ansid=son[ansid];
}
cout<<endl<<ans<<endl;
}
最新文章
- OSS层基础:平台区分
- npm 安装 ionic cordova
- Jsonp跨域访问原理和实例
- css3 半个字符美化方法
- Dx unsupported class file version 52.0
- springboot themleaf 开发笔记
- oracle 10g 学习之创建和管理表(7)
- C++:undefined reference to vtable 原因与解决办法[转]
- css3 盒模型
- [Redux] Refactoring the Entry Point
- java实现简单的单点登录_转
- 实际情况来看,还是yield很爽
- 【转载】使用SDL播放YUV图像数据(转)
- 周一02.4变量&;垃圾回收机制
- Redis常用命令【字符串】
- 【组合&;取补集】数三角形 @CQOI2014/BZOJ3505/upcexam3843
- wordpress更换主题未能连接到FTP服务器
- 写给大忙人的Elasticsearch架构与概念(未完待续)
- centos 安装 和 linux 简单命令
- python 全局变量的使用
热门文章
- PHP在cli模式下传参说明
- webpack 中导入 vue 和普通网页使用 vue 的区别(四)
- mysql 主从 binlog
- OSPF-1-OSPF的数据库交换(5)
- Curious Array Codeforces - 407C(高阶差分(?)) || sequence
- linux系统任务调度命令crontab
- linux下php以fastcgi模式运行
- [转]依赖注入框架Autofac的简单使用
- 登录界面点击登录后如何延迟提示成功的div的显示时间并跳转
- Wrapper class package.jaxws.methodName is not found. Have you run APT to generate them?解决方案