ACM-12月7日周四周中训练心得

    这周训练赛暂停了,周五,也就是明天会有一个比赛,想参加试试。

    这周老师把专题的时间延长了,其意味不言而喻,看我们铁定达不成要求了,要把每个题目都要仔细研究。这周看了G这道题,题意大概是有n个Boss,其中有n-1个小boss必须先全部打完才能打第n个大BOSS,打一个小boss要耗体能usei,打完后恢复一部分vali,一开始体能为100,在打的过程中也最多为100,问能打完全部的BOSS? 如果能就输出“clear!!!”, 否则输出“try again”。准备用DP[i]表示打完i状态剩余的最大体能。

 

for(int i=1;i<(1<<(n-1));i++)  
        {  
            HP[i]=-9999;  
            for(int j=0;(1<<j)<=i;j++) 
                if(i&(1<<j)&&HP[i-(1<<j)]>=use[j])  
                {  
                    int m=HP[i-(1<<j)]-use[j]+val[j];  
                    if(m>100)m=100;  
                    if(m>HP[i])HP[i]=m;  
                }  
        } 

    对于D题,题目大致的意思是一个人要送n份货,给出一个矩阵,表示任意两个点间的直接路径的时间,求从起点0送完这n份货(到达指定的n个地点)再回到起点0的最短时间,由于n本身不大,可以状态压缩,首先用弗洛伊德处理一下任意两点的最短路,dp[i][j]表示在状态i的条件下到城市j的最短时间,如果i == (1 << (j - 1)),表示从只经过城市j,这时候dp[i][j] = dis[0][j],否则就是要经过别的城市到达j,这里枚举当前状态下经过的除了j的其他城市,注意一定是当前状态下,这里类似Floyd,最后dp[(1 << n) - 1][i]表示经过了所有店到达i我们只要枚举dp[(1 << n) - 1][i] + dis[i][0]的最小值即可。 

 

 

 for(int i = 0; i <= (1 << n) - 1; i++)  
        {  
            for(int j = 1; j <= n; j++)  
            {  
                if(i == (1 << (j - 1)))  
                    dp[i][j] = dis[0][j];  
                else  
                {  
                    dp[i][j] = INF;  
                    for(int k = 1; k <= n; k++)  
                        if((k != j) && (i & (1 << (k - 1)))) //这里是当前状态下  
                            dp[i][j] = min(dp[i][j], dp[i ^ (1 << (j - 1))][k] + dis[k][j]);  
                }     
            }  
        }  
        int ans = dp[(1 << n) - 1][1] + dis[1][0];  
        for(int i = 2; i <= n; i++)  
        {
             ans = min(ans, dp[(1 << n) - 1][i] + dis[i][0]);  
         }

 

 

 

 

 

 


 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值