P2196 挖地雷

P2196 挖地雷

题目背景

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
//逆推
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N=2100;

int pre[N];
int ans[N];
int w[N];
bool can[N][N];
int _x=1,_y=1,n,max_ans;

inline int read()
{
    int x=0;char c=getchar();int f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
    return x*f;
}

int main()
{
    //freopen("landmine.in","r",stdin);
    //freopen("landmine.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)
        w[i]=read();
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
        {
            _x=read();
            if(_x)
                can[i][j]=1;
        }
    ans[n]=w[n];//倒叙
    int val,k;
    for(int i=n-1;i>=1;i--)
    {
        val=0,k=0;
        for(int j=i+1;j<=n;j++)
            if(can[i][j]&&ans[j]>val)
                val=ans[j],
                k=j;
        ans[i]=val+w[i];
        pre[i]=k;
    }
    k=1;
    for(int i=2;i<=n;i++)
        if(ans[i]>ans[k])
            k=i;
    max_ans=ans[k];
    printf("%d",k);//倒叙,所以在最优路线中,最大值得编号在最前,所以这样输出
    k=pre[k];
    while(k)
        printf(" %d",k),
        k=pre[k];
    printf("\n%d",max_ans);
    return 0;
}
时间: 2024-12-14 08:58:45

P2196 挖地雷的相关文章

洛谷——P2196 挖地雷

题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束.设计一个挖地雷的方案,使某人能挖到最多的地雷. 输入输出格式 输入格式: 输入文件mine.in有若干行. 第1行只有一个数字,表示地窖的个数N. 第2行有N个数,分别表示每个地窖中的地雷个数. 第3行至第N+1行表示

洛谷—— P2196 挖地雷

https://www.luogu.org/problem/show?pid=2196 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束.设计一个挖地雷的方案,使某人能挖到最多的地雷. 输入输出格式 输入格式: 输入文件mine.in有若干行. 第1行只有一个数字,表

Luogu P2196 挖地雷

https://www.luogu.com.cn/problem/P2196 solution 记录挖掘最优路径 #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define INF 2147483647 int n,c,An

PyQt挖地雷游戏学习笔记(2)

分析多个文件组成的源代码,最好使用辅助工具. 我试过Source Navigator 和 Source Insight,感觉后者功能多些,比较好用. 一.程序的组成模块等文件 这个挖地雷游戏,主要由2种文件组成: 1.程序模块 主程序main.py:负责主窗口物件,按钮和菜单的设置.事件处理.程序初始化.结束等等. 游戏逻辑模块game_scene.py:负责游戏规则.棋盘显示.胜负裁判.记录得分等等. "导入"文件lib.py:导入一些通用的模块,其他文件只需导入lib.py. 游戏

挖地雷问题(DAG最长路)

挖地雷问题 (P3.pas/c/cpp) 来源:NOIP1996(提高组)第三题(有改动) [问题描述] 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径. 当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束.设计一个挖地雷的方案,使某人能挖到最多的地雷. [输入文件] N:(表示地窖的个数)   W1,W2,W3,--WN (表示每个地窖中埋藏的地雷数量) A12-

PyQt挖地雷游戏学习笔记(6)

学习别人的作品,有一大好处,可以反观自己的不足. 自己的不足,往往是基础知识有欠缺,基本功不扎实. 今天,再补一课:星号表达式(*expression). 挖地雷程序中,有2处用到星号表达式.一是在main.py,另一处在game_scene.py. 先看第一处的情况: @pyqtSlot() def on_action_Setup_triggered(self): result = setup.getSetup() if not result: return self.scene.setMap

PyQt挖地雷游戏学习笔记(1)

想学会PyQt.按习惯做法,从分析学习编程实例着手. 从网上找了个"挖地雷"的源码,大卸八块,仔细解剖,力图学到些东西. 原程序中有bug,如:"棋盘"没有下边界线:挖出全部地雷后,程序没反应,不认定获胜. 我已将其铲掉,可以正常运行了. 程序源码可在此下载 所做修改,都在game_scene.py.共有2处: 一是在函数checkWin()中,原文是: if ((self.mine_map == self.flag_map).all() and (self.min

落谷 2196 挖地雷

题面: 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束.设计一个挖地雷的方案,使某人能挖到最多的地雷. 输入输出格式 输入格式: 第1行只有一个数字,表示地窖的个数N. 第2行有N个数,分别表示每个地窖中的地雷个数. 第3行至第N+1行表示地窖之间的连接情况: 第3行有n-1个数(0或1),表示第一个地窖

挖地雷

传送门:https://www.luogu.org/problemnew/show/P2196. 逆推 #include<cstdio> using namespace std; int n,f[25],c[25],a[25],x,y,t,k,ans,map[25][25]; int main() { scanf("%d",&n); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); for(i