Hdu 4701 Game -- DP

来源:互联网 发布:手机淘宝网商城首页 编辑:程序博客网 时间:2024/04/28 10:56


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4701

题意:ALICE 和 BOB轮流买物品,物品有顺序,有价格。规定只有前一个物品被买之后才可以买后一个物品。

ALICE先走,分别有A、B的钱。最优策略求必胜。

分析:DP,dp[i]表示买到第i个物品时,Alice需要最少dp[i]的钱就能获胜。

转移方程:dp[i] = min( dp[i+1]+p[i] , allmoney - (dp[i+1]-1) );

因为买到第i个物品时,必赢的策略有两种:1.直接把后面能买的买完。2.把当前物品买完之后,下一件(多件)物品,后一个人不能一次性买完。

取二者的较小值,赋值dp[i].

 

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;#define ll __int64#define N 1000000+5int p[N];ll s[N],dp[N],sum[N];int main(){    int n,a,b;    while(cin>>n>>a>>b)    {        ll all = 0;int stop = 0;        cin>>p[0];sum[0] = p[0];        for (int i = 1; i < n; i++){            cin>>p[i];            if(!stop){//stop的含义是说前stop个物品的价格总和就已经超过二人的钱数总和,stop后面的就不用再考虑。                sum[i] = p[i]+sum[i-1];                if(sum[i]>a+b)stop = i;            }        }        if(!stop)stop = n;        stop--;        dp[stop] = p[stop];        for (int i = stop-1; i >=0; i--){            if(i>0)all = a+b-sum[i-1];//找到allmoney            else all = a+b;            dp[i] = min(dp[i+1]+p[i],all-dp[i+1]+1);//转移        }        puts(a>=dp[0]?"ALICE":"BOB");    }    return 0;}

原创粉丝点击