• 挖地雷dp c++


     1 //
     2 // Created by Arc on 2020/4/27.
     3 //
     4 
     5 /*题文:
     6  * 在一个地图上有n个地窖
     7  * ,每个地窖中没有一定数量的地雷,
     8  * 同时给出地窖之间连接的路径,
     9  * 并规定路径都是单向的。
    10  * 且保证都是小序号地窖指向大序号地窖,
    11  * 也不存在可以从一个地窖出发,经过若干后又回到原来地窖的路径
    12  * 某人可以从任意一处开始挖地雷,然后沿着指出的路径往下挖,只能选择一条路径,当没有连接时,挖地雷工作结束设计,一个挖地雷的方案使他能挖到最多的地雷
    13  * 输入:
    14  * 第一行为坑总数
    15  * 第二行为每个坑的地雷数
    16  * 接下来的几行是都有哪两个坑可以连接,
    17  * 输入0 0 表示结束
    18  * 输出:
    19  * 最大地雷数以及路径
    20  * (一看见这种路径,是不是直接想到一个数组存放地址啊)
    21 
    22  */
    23 //思路:
    24 //我们知道dp有个无后效性原则
    25 //你看看上面题目:
    26 //规定路径都是单向的。
    27 //* 且保证都是小序号地窖指向大序号地窖,
    28 //* 也不存在可以从一个地窖出发,经过若干后又回到原来地窖的路径
    29 //--很明显了啊
    30 //
    31 //
    32 /*存放变量:
    33  * 和前面的dp几乎一样,也是从倒数第二个逆推
    34  * w[i]是指每个坑有几个地雷
    35  * a[i][j]是指i,j之间是否有通路//和城市交通线不同,这个地方不是没有通路就为0,所以输入方式也不太一样
    36  * f[i]表示i往后的最多能挖到多少
    37  * c[i]是个存放位置的.
    38  */
    39 #include<bits/stdc++.h>
    40 using namespace std;
    41 int main(){
    42     long f[201]={0},w[201]={0},c[201];
    43     bool a[201][201]={0};
    44     long n;
    45     long x,y;
    46    memset(a,false,sizeof(a));
    47     cin>>n;
    48     for (int i = 1; i <=n ; ++i) {//每个坑的地雷数
    49         cin>>w[i];
    50 
    51     }
    52     do{
    53         cin>>x>>y;
    54         if((x!=0)&&(y!=0)){
    55             a[x][y]=true;
    56         }
    57 
    58     }while((x!=0)||(y!=0));
    59     f[n]=w[n];//初始值
    60     for (int j = n-1; j >= 1; j--) {
    61         int l=0;
    62         for (int i = j+1; i <=n ; ++i) {
    63             if(a[j][i] && (l<f[i])){
    64                 l=f[i];
    65                 c[j]=i;
    66             }
    67 
    68         }
    69         f[j]=l+w[j];//本次最长等于本坑地雷数加后面的
    70 
    71 
    72     }
    73     int k=1;
    74     for (int m = 2; m <= n; ++m) {
    75         if(f[m]>f[k])
    76         {
    77             k=m;
    78         }
    79     }
    80     cout<<f[k]<<endl;
    81     cout<<k;
    82     k=c[k];
    83     while(k!=0){
    84         cout<<"-"<<k;
    85         k=c[k];
    86 
    87     }
    88     return 0;
    89 
    90 
    91 }
  • 相关阅读:
    Java8新特性Stream详细教程
    自定义注解!绝对是程序员装逼的利器!!
    如何处理重复请求/并发请求的
    C#字符处理
    mysql 索引
    mysql事件【定时器】
    JS日期,金钱处理
    Controller中使用@Value无法获取属性值
    druid连接池的配置
    mybatiste报错java.lang.ClassCastException
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12785786.html
Copyright © 2020-2023  润新知