• 打怪(剪枝完暴力搜)另类做法


    问题 B: 打怪

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 83  解决: 8
    [提交] [状态] [命题人:admin]

    题目描述

    小M喜欢打怪兽。
    这天,她又在打怪兽。
    经过了努力,她已经来到了最后的boss战,她已经知道自己可以有N个回合进行操作,每个回合可以进行下面若干种操作之一:
    ·执行一次攻击,第i个回合发动攻击,造成的伤害等于对boss造成当前的攻击力A与本回合攻击力di之和。
    ·使用一次能力,之后的每个回合开始时自己的攻击力A都会增加ai点。
    ·使用一次能力,使得自己当前的攻击力A增加bi点。
    一开始小M的攻击为0,现在小M想要知道N个回合后小M对boss能够造成最多的伤害总量。

     

    输入

    第一行一个正整数N。
    接下来N行,每行三个正整数di,ai,bi。

     

    输出

    输出一行一个整数表示答案。

     

    样例输入

    2
    3 1 2
    3 1 2
    

    样例输出

    6
    思路:暴力的话,考虑对每一个i有三种操作,所以是3

    100

    时间复杂度太高,所以适当剪枝。
    对于一个i考虑当前攻击力ac和每回合要加的数t对后续的影响。另开一个数组记录
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll a[105],d[105],b[105];
    ll f[105];
    ll ans=0,n;
    void dfs(int step,ll ac,ll sum,ll t)
    {
        ac+=t;
        if(step>n)
        {
            ans=max(ans,sum);
            return;
        }
        int j=n-step+1;
        if(sum+ac*j+t*(j+1)*j/2<=f[step]&&f[step]!=0) return;
        f[step]=sum+ac*j+t*(j+1)*j/2;
        dfs(step+1,ac,sum+d[step]+ac,t);
        dfs(step+1,ac,sum,t+a[step]);
        dfs(step+1,ac+b[step],sum,t);
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld%lld%lld",d+i,a+i,b+i);
        }
        dfs(1,0,0,0);
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    PHP开发经常遇到的几个错误
    PHP的Trait
    PHP反射API
    php split 和 explode 的区别
    php判断检测一个数组里有没有重复的值
    PHP serialize 和 JSON 解析与区别
    php 单文件上传
    php 数组 类对象 值传递 引用传递 区别
    六. 网络编程(解决黏包TCP)
    五. 网络编程(UDP 不黏包)
  • 原文地址:https://www.cnblogs.com/Suiyue-Li/p/10981805.html
Copyright © 2020-2023  润新知