标签:c++ 设计 输入 数组 路径 mes end 城市 out
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 }
标签:c++ 设计 输入 数组 路径 mes end 城市 out
原文地址:https://www.cnblogs.com/zhmlzhml/p/12785786.html