挖地雷(Mine)

在一个地图上有N 个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且从编号小的地窖通向编号大的地窖。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

【输入格式】

N {地窖的个数}

W1,W2,……WN {每个地窖中的地雷数}

X1,Y1 {表示从X1可到Y1,保证xi小于yi}

X2,Y2

……

0 ,0 {表示输入结束}

【输出格式】

K1-K2-……-Kv {挖地雷的顺序}

MAX {最多挖出的地雷数}

【输入样例】Mine.in

6

5 10 20 5 4 5

1 2

1 4

2 4

3 4

4 5

4 6

5 6

0 0

【输出样例】Mine.out

3-4-5-6

34

【解题思路】

根据题目中规定路径都是单向的,且从编号小的地窖通向编号大的地窖,可以确定本题可以使用动态规划解决。首先思考求解时最后一步会做什么——选择最后一个地窖,挖走其中的地雷。

依据此来推出状态转移方程

设f[i]表示以i地窖为结束点能挖到的最大地雷数。

那么可以写出f[i]=max(f[j]+a[i])

条件是j小于i且j到i有通道连接。

挖地雷的路线可以在每次求f[i]时记住f[i]的值从哪里来,记住j值。

最后根据终点走回去即可。

不过我的程序使用了另一种方式,用动态数组记录现在走的路线。

【参考程序】

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,w[250],f[250],map[300][300],ans,x,y,choice;
vector<int> road[250];
int main()
{
freopen("mine.in","r",stdin);
freopen("mine.out","w",stdout);
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>w[i];
f[i]=w[i];
road[i].push_back(i);
//输入,初始化,假设每一个地窖都以自己为起点和终点。
}
cin>>x>>y;
while (x!=0&&y!=0)
{
map[x][y]=true;//记录连线
cin>>x>>y;
}
for (int i=2;i<=n;i++)
{
choice=-1;
for (int j=1;j<i;j++)
if (map[j][i]&&f[i]<f[j]+w[i]) //判断条件
{
f[i]=f[j]+w[i];
choice=j;//记录选择
} if (choice!=-1)
{
road[i].clear();//清除记录
for (int j=0;j<road[choice].size();j++)
road[i].push_back(road[choice][j]);//重新记录
road[i].push_back(i);//把终点压入
} }
for (int i=1;i<=n;i++)
if (ans<f[i])
{
ans=f[i];
choice=i;
}
//求最大答案
cout<<road[choice][0];
for (int i=1;i<road[choice].size();i++) cout<<"-"<<road[choice][i];
cout<<endl<<ans;
return 0;
}

【2018寒假集训 Day2】【动态规划】挖地雷的更多相关文章

  1. 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)

    花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...

  2. 【2018寒假集训 Day2】【动态规划】又上锁妖塔

    又上锁妖塔 (tower.in/tower.out) [题目描述] 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>,可是小A很 ...

  3. 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)

    钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...

  4. 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)

    垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...

  5. 【2018寒假集训 Day2】【动态规划】抢金块

    抢金块 输入文件:gold.in 输出文件:gold.out 问题描述: 地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步 .如果S=2,T=4.你就可以跳 ...

  6. 【2018寒假集训 Day2】【动态规划】回文字

    回文字(palin) 问题描述: 如果一个单词从前和从后读都是一样的,则称为回文字.如果一个单词不是回文字,则可以把它拆分成若干个回文字.编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文 ...

  7. 【2018寒假集训 Day2】【动态规划】维修栅栏

    维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...

  8. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  9. 2022寒假集训day2

    day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...

随机推荐

  1. C++ 11标准

    C++11,也称为C++0x.为目前C++编程语言的最新正式标准(ISO/IEC 14882:2011).它将取代第二版标准ISO/IEC 14882:2003(第一版ISO/IEC 14882:19 ...

  2. Java基础(五)继承和多态

    1.多态 先来看一个例子,其中Employee类是父类,Manager类继承了Employee类: public static void main(String[] args) { // constr ...

  3. (四)Trigger

    在游戏物体上可以添加Trigger组件,它与unity的eventTrigger类似,但功能更复杂详细. 在游戏物体上田间Trigger,并通过add new event来添加相关功能,如下图所示,添 ...

  4. vueclass

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Linux sh脚本用spool导出oracle数据库指定表表数据

    脚本如下,已验证可用,可配合crontab使用. 1 #!/bin/bash cd /opt/oracle/datafor_kf #redirect environment variables sou ...

  6. 激活Sublime Text 3,亲测有效!

    一.修改sunlime_text.exe 打开Sublime Text的安装目录,在修改之前要先备份一下sunlime_text.exe. 欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. ...

  7. 第三十章 System V信号量(一)

    信号量 信号量和P.V原语由Dijkstra(迪杰斯特拉)提出 信号量: 互斥: P.V在同一进程中 同步: P.V在不同进程中 信号量值含义 S>0 : S表示可用资源个数 S=0 : 表示无 ...

  8. NOIP模拟 15

    因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...

  9. m76 赛后总结

    这次没有炸的太厉害,只是T3崩了,而且..... 这次的心态并没有因为loj的大吉而崩,反而在经受过上一轮的打击之后变得坚强了,心态也平了,没什么可挂念的,因为我什么都没有,所以发扬光脚的不怕穿鞋的精 ...

  10. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...