zoukankan      html  css  js  c++  java
  • 【洛谷P2964】[USACO09NOV]硬币的游戏A Coin Game

    题目描述

    农夫约翰的奶牛喜欢玩硬币游戏.

    初始时,一个有N枚硬币的堆栈放在地上,从堆顶数起的第i枚硬币的币值 为Ci

    开始玩游戏时,第一个玩家可以从堆顶拿走一枚或两枚硬币.如果第一个玩家只拿走堆顶的 一枚硬币,那么第二个玩家可以拿走随后的一枚或两枚硬币.如果第一个玩家拿走两枚硬币,则第二个玩家可以拿走1,2,3,或4枚硬币.在每一轮中,当前的玩家至少拿走一枚硬币,至多拿 走对手上一次所拿硬币数量的两倍.当没有硬币可拿时,游戏结束.

    两个玩家都希望拿到最多钱数的硬币.请问,当游戏结束时,第一个玩家最多能拿多少钱 呢?

    输入输出格式

    输入格式:

    • Line 1: A single integer: N

    • Lines 2..N+1: Line i+1 contains a single integer: C_i

    输出格式:

    • Line 1: A single integer representing the maximum value that can be made by the first player.

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=2005;
    inline void read(int &x){
        x=0; char ch=getchar();
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    }
    int n;
    int c[maxn],sum[maxn],f[maxn][maxn];
    int main(){
        read(n);
        for(int i=n;i>0;--i) read(c[i]);
        for(int i=1;i<=n;++i) sum[i]=sum[i-1]+c[i];
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j){
            f[i][j]=f[i][j-1];
            int k=(j<<1)-1;
            if(k<=i) f[i][j]=max(f[i][j],sum[i]-f[i-k][k]);
            k=(j<<1);
            if(k<=i) f[i][j]=max(f[i][j],sum[i]-f[i-k][k]);
        }
        printf("%d
    ",f[n][1]);
        return 0;
    }
        
  • 相关阅读:
    C#委托及事件 详解(讲得比较透彻)
    浅谈前端常用脚手架cli工具及案例
    C++实现二分法详解
    重新整理 .net core 实践篇————重定向攻击[三十九]
    动态规划_备忘录法_矩阵链乘问题
    完了,又火一个项目
    DOM常用的属性和方法
    一些胡乱的吐槽
    Mac安装compass失败的原因
    css动画animation-keyframes
  • 原文地址:https://www.cnblogs.com/huihao/p/7759757.html
Copyright © 2011-2022 走看看