zoukankan      html  css  js  c++  java
  • [LUOGU] P2196 挖地雷

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

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247497.html

  • 相关阅读:
    VS2010-MFC(常用控件:列表框控件ListBox)
    VS2010-MFC(常用控件:按钮控件的编程实例)
    VS2010-MFC(常用控件:按钮控件Button、Radio Button和Check Box)
    VS2010-MFC(常用控件:编辑框Edit Control)
    VS2010-MFC(常用控件:静态文本框)
    VS2010-MFC(对话框:颜色对话框)
    VS2010-MFC(对话框:字体对话框)
    VS2010-MFC(对话框:文件对话框)
    VS2010-MFC(对话框:消息对话框)
    [洛谷P2113] 看球泡妹子
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247497.html
Copyright © 2011-2022 走看看