zoukankan      html  css  js  c++  java
  • hdu 1561 The more, The Better

    The more, The Better

    Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2850    Accepted Submission(s): 1684


    Problem Description
    ACboy 很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原 因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?
     

    Input
    每 个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。
     

    Output
    对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。
     

    Sample Input
    3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
     

    Sample Output
    5 13
     

    Author
    8600
     

    Source
     

    Recommend
    LL
       // 给定n个地点,每个地点藏有cost[i]的宝物,取得某些宝物有时需要先取其他宝物,现在让我们选m个地点问最多可以选多少宝物?
       // dp[v][j] 表示以v为根 在占领j个城堡时的最大收获
       // 这里应该不可以成环吧 
    //第一个树形DP+背包,呵呵、慢慢来、现在还理解不透彻
    //加油
    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> #define N 222 using namespace std; struct Edge//第一次用这种方法表示树,以前只会邻接矩阵,弱 { int to; int next; }ed[N]; int v[N],cost[N]; bool visit[N]; int dp[N][N]; int n,m; void dfs(int k) { if(v[k]==-1) return; int i,j,e,vx; for(e=v[k];ed[e].next!=-1;e=ed[e].next) { vx=ed[e].to; dfs(vx); for(j=m;j>=2;j--) for(i=1;i<j;i++) dp[k][j]=max(dp[k][j],dp[k][j-i]+dp[vx][i]); } vx=ed[e].to; dfs(vx); for(j=m;j>=2;j--) for(i=1;i<j;i++) dp[k][j]=max(dp[k][j],dp[k][j-i]+dp[vx][i]); } int main() { int i,j,k; int a,b; while(scanf("%d%d",&n,&m),m||n) { memset(v,-1,sizeof(v)); dp[0][1]=cost[0]=0; for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); cost[i]=b; ed[i].to=i; ed[i].next=v[a]; v[a]=i; } m++;//开始这写错地方了,Wa了 for(i=0;i<=n;dp[i][0]=0,i++) for(dp[i][1]=cost[i],j=2;j<=m;j++) dp[i][j]=-1; dfs(0); printf("%d\n",dp[0][m]); } return 0; }

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #define N 222
    using namespace std;
    struct Edge
    {
        int to;
        int next;
    }ed[N];
    int v[N],cost[N];
    bool visit[N];
    int dp[N][N];
    int n,m;
    void dfs(int k)
    {
        if(v[k]==-1)
         return;
        int i,j,e,vx;
      for(e=v[k];ed[e].next!=-1;e=ed[e].next)
        {

            vx=ed[e].to;
            dfs(vx);
            for(j=m;j>=2;j--)
              for(i=1;i<j;i++)
                dp[k][j]=max(dp[k][j],dp[k][j-i]+dp[vx][i]);
        }
        vx=ed[e].to;
        dfs(vx);
         for(j=m;j>=2;j--)
            for(i=1;i<j;i++)
              dp[k][j]=max(dp[k][j],dp[k][j-i]+dp[vx][i]);
    }
    int main()
    {
        int i,j,k;
        int a,b;
        while(scanf("%d%d",&n,&m),m||n)
        {
           memset(v,-1,sizeof(v));
           dp[0][1]=cost[0]=0;
           for(i=1;i<=n;i++)
           {
              scanf("%d%d",&a,&b);
              cost[i]=b;
              ed[i].to=i;
              ed[i].next=v[a];
              v[a]=i;
           }
           m++;
           for(i=0;i<=n;dp[i][0]=0,i++)
             for(dp[i][1]=cost[i],j=2;j<=m;j++)
                   dp[i][j]=-1;
           
            dfs(0);
            printf("%d\n",dp[0][m]);
        }
        return 0;
    }

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/372465774y/p/2622812.html
Copyright © 2011-2022 走看看