2021牛客寒假算法基础集训营6机器人(状态压缩Dp,公式推导)

链接:https://ac.nowcoder.com/acm/contest/9986/G
来源:牛客网

注意在数据范围小的时候,考虑状压DP,和注意可以从两个元素入手推导多个元素

有 n 个机器人,每个机器人会读入一个 x ,并返回 ax+b 。

现在银临姐姐手里有一个数 x ,她想将机器人按某种顺序排列,使得最终返回得到的 x 尽可能大。

在这里插入图片描述
解法一:对于任意两个函数,A在内或者B在内,推导出公式,排序

bool cmp(node a,node b){
    
    
    return a.b * b.a + b.b > a.a * b.b + a.b;
}
int main()
{
    
    
    __int128 n,x,ans;
    ans = 0;
    n = read();x = read();
    __int128 sum = 1;
    for(int i = 1;i <= n;i ++){
    
    
        Node[i].a = read();Node[i].b = read();
    }
    sort(Node + 1,Node + 1 + n,cmp);
    for(int i = 1;i <= n;i ++){
    
    
        x = Node[i].a * x + Node[i].b;
    }
    write(x);
    return 0;
}
解法二:状压DP
```cpp
dp[0] = x;
    for(ll i = 0;i <= (1 << n) - 1;i ++){
    
    
        for(int j = 1;j <= n;j ++){
    
    
            __int128 x = (1 << (j - 1));
            if(i & x) continue;
            dp[i ^ x] = max(dp[i ^ x],dp[i] * Node[j].a + Node[j].b );
        }
    }
    write(dp[(1 << n) - 1]);



猜你喜欢

转载自blog.csdn.net/qq_45673816/article/details/114117934