挖地雷dp c++

时间:2020-04-27
本文章向大家介绍挖地雷dp c++,主要包括挖地雷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 }

原文地址:https://www.cnblogs.com/zhmlzhml/p/12785786.html