【2018寒假集训 Day2】【动态规划】挖地雷
挖地雷(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】【动态规划】挖地雷的更多相关文章
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- 【2018寒假集训 Day2】【动态规划】又上锁妖塔
又上锁妖塔 (tower.in/tower.out) [题目描述] 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>,可是小A很 ...
- 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)
钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...
- 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)
垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...
- 【2018寒假集训 Day2】【动态规划】抢金块
抢金块 输入文件:gold.in 输出文件:gold.out 问题描述: 地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步 .如果S=2,T=4.你就可以跳 ...
- 【2018寒假集训 Day2】【动态规划】回文字
回文字(palin) 问题描述: 如果一个单词从前和从后读都是一样的,则称为回文字.如果一个单词不是回文字,则可以把它拆分成若干个回文字.编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文 ...
- 【2018寒假集训 Day2】【动态规划】维修栅栏
维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...
- 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人
蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...
- 2022寒假集训day2
day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...
随机推荐
- SpringBoot整合MybatisPlus3.X之SQL执行分析插件(十四)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- URL中文参数,JSON转换,PHP赋值JS
var jsonProps = { "dispMode":dispMode, "autoRun":autoRun, "clientPath" ...
- ElasticSearch 中文分词插件ik 的使用
下载 IK 的版本要与 Elasticsearch 的版本一致,因此下载 7.1.0 版本. 安装 1.中文分词插件下载地址:https://github.com/medcl/elasticsearc ...
- NOI1995 石子合并 [Luogu P1880]
一道区间dp的模板题,这里主要记一下dp时环形数据的处理. 简略版:方法一:枚举分开的位置,将圈化为链,因此要做n次. 方法二:将链重复两次,即做一个2n-1长度的链,其中第i(i<=n)堆石子 ...
- C++学习笔记10_输入输出流.文件读写
//从键盘输入到程序,叫标准input:从程序输出到显示器,叫标准output:一并叫标准I/O //文件的输入和输出,叫文件I/O cout<<"hellow word&quo ...
- MIT线性代数:19.行列式和代数余子式
- 真正的打包scrapy单文件(不包含cfg)
前置:https://www.cnblogs.com/luocodes/p/11827850.html 解决最后一个问题,如何将scrapy真正的打包成单文件 耗了一晚上时间,今天突然有灵感了 错误分 ...
- Numpy 中的聚合操作
# 导包 import numpy as np sum np.random.seed(10) L = np.random.random(100) sum(L) np.sum(L) min np.min ...
- 非旋treap (fhq treap) 指针版
传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...
- [考试反思]1017csp-s模拟测试77(lrd day1) :反抗
说在前面:强烈谴责AK神Mr_zkt没有丝毫素质RP-- 然而我也想没素质一次,但是我没机会AK一套除了B组题以外的题... 太菜了,没权力.人家AK了人家就是牛逼你没话说 达哥的题必须好好写反思. ...