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].
题意: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; }
相关文章推荐
- Hdu 5693 D Game【区间Dp】好题!
- HDU 4701 - Game
- HDU-5945 Fxx and game (dp+单调队列)
- HDU 4616 Game(树形dp,两遍dfs)
- hdu 4701 Game(博弈)
- 【HDU 5456】 Matches Puzzle Game (数位DP)
- HDU 4326 Game(概率DP+高斯消元)
- HDU 5863 cjj's string game(矩阵dp)
- HDU 5456 Matches Puzzle Game(数位DP)
- hdu 5945 Fxx and game(单调队列,dp)
- HDU 5456 Matches Puzzle Game [数位DP]
- hdu 4616 Game(树形dp)
- hdu 5945 Fxx and Game dp(单调队列优化)
- hdu 5456 Matches Puzzle Game(dp)
- 【hdu 5945】Fxx and game(递推|dp+单调队列)
- 【HDU】5426 Rikka with Game【DP】
- HDU 5945 Fxx and game(DP+单调队列)
- HDU 5693 D Game(区间dp)
- hdu 1505 dp City Game
- HDU 1054.Strategic Game【动态规划、DP】【4月7】