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;}
- Hdu 4701 Game -- DP
- [HDU 4701 Game] DP
- hdu 5218 Game (dp)
- dp- hdu 5218Game
- hdu - 4326 - Game - 概率dp
- hdu 1505 dp City Game
- 【树形DP】 HDU 4616 Game
- 树形dp hdu-4616-Game
- HDU 1505 City Game (DP)
- hdu 1505 City Game(DP)
- hdu 1505 City Game(DP)
- Strategic Game+hdu+树形dp
- 【HDU】4616 Game 树型DP
- hdu 4616 game (树形dp)
- hdu 1505 City Game dp
- hdu 4616 Game 树形dp
- hdu 5502 Candy Game(dp)
- HDU 5550 Game Rooms(DP)
- 技术面试的方式
- java中负数的二进制表示
- JavaScript世界的一等公民 - 函数
- Base64编码原理及编码、解码实现
- Android局域网发送文件(四)
- Hdu 4701 Game -- DP
- 2013年9月30日、十一八天乐你学你快乐!|如何在eclipse jee中创建Maven project并且转换为Dynamic web project
- 我的必读书单及下载链接[百度网盘]
- JPS 工具, 显示当前Java进程
- js获取鼠标位置(兼容ie和火狐)
- 网站被黑客攻击导致降权,怎么办?
- C++标准库 vector排序
- java中的static测试一例
- HDU 4763 Theme Section(KMP)