• 信息学奥赛一本通 1262:【例9.6】挖地雷 动态规划基本型


    1262:【例9.6】挖地雷


    时间限制: 1000 ms         内存限制: 65536 KB

    【题目描述】

    在一个地图上有n个地窖(n≤200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任意一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

    【输入】

    第一行:地窖的个数;

    第二行:为依次每个地窖地雷的个数;

    下面若干行:

    xi yi   //表示从xi可到yi,xi

    最后一行为"0 0"表示结束。

    【输出】

    k1−k2−…−kv    //挖地雷的顺序

    挖到最多的雷。

    【输入样例】

    6
    5 10 20 5 4 5
    1 2
    1 4
    2 4
    3 4
    4 5
    4 6
    5 6
    0 0

    【输出样例】

    3-4-5-6
    34
    

    解析:

    详见代码:

    1. #include
    2. using namespace std;
    3. int n;
    4. int a[205];//地雷数
    5. int b[205];//b[i]表示到第i个地窖,从b[i]号地窖来的路径上雷最多
    6. int c[205];//c[i]表示到第i个地窖,雷最多路径上的雷的数量
    7. bool jh=0;//第一个地窖编号前没有减号
    8. struct node {
    9. int x;
    10. int y;
    11. };
    12. node d[40005];
    13. void myprint(int x){
    14. if (x==0) return;//没有前一个地窖了
    15. myprint(b[x]);
    16. if (jh==0){//没有减号
    17. jh=1;//下次就有减号了
    18. }else{
    19. cout<<'-';//输出减号
    20. }
    21. cout<
    22. }
    23. bool cmp(node x,node y){
    24. return x.x
    25. }
    26. int main(){
    27. cin>>n;
    28. for(int i=1;i<=n;i++){
    29. cin>>a[i];
    30. }
    31. int x,y;
    32. int cnt=0;
    33. while (cin>>x>>y){
    34. if (x==0&&y==0) break;
    35. cnt++;
    36. d[cnt].x=x;
    37. d[cnt].y=y;
    38. }
    39. //按开始地窖从小到大排序,保证当计算当前地窖时,
    40. //所有通往当前地窖的路径都已经计算完成
    41. sort(d+1,d+1+cnt,cmp);//出发地窖从小到大排序
    42. for(int i=1;i<=cnt;i++){
    43. x=d[i].x;
    44. y=d[i].y;
    45. if (c[x]+a[x]>c[y]){//如果从x来路径上的雷比其他路径上多
    46. c[y]=c[x]+a[x];//记录最多得雷
    47. b[y]=x;//记录路径
    48. }
    49. }
    50. int k=0;
    51. int ans=0;
    52. for(int i=1;i<=n;i++){//枚举每一个地窖
    53. if (a[i]+c[i]>ans){//取最大值
    54. ans=a[i]+c[i];
    55. k=i;//最后一个地窖
    56. }
    57. }
    58. myprint(k);//递归打印路径
    59. cout<
    60. return 0;
    61. }

  • 相关阅读:
    设计模式---原型模式
    【阅读笔记】如何阅读一本书
    AI实战营第二期 第九节 《底层视觉与MMEditing》——笔记10
    C++打怪升级(二)- 引用详解
    kafka开发环境搭建
    双点双向重分发实验
    linux下进程的理解(1)
    shiny | 使用R创建一个网页应用(Web App)
    JAVA --- Collectioncenter
    HP DL380z Gen9服务器Led故障灯说明
  • 原文地址:https://blog.csdn.net/qq_36230375/article/details/136468467