您的位置:首页 > 其它

Hdu 4701 Game -- DP

2013-09-30 09:46 387 查看
题目链接: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+5
int p
;
ll s
,dp
,sum
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博弈DP