Alice和Bob玩游戏,已知要从左到右依次分配n个数,规则是当前拥有令牌的人可以选择当前数字的归属,这一轮不获得数字的人将获得令牌。初始Bob拥有令牌,要求输出二者的最大收益。
解法的特色在于不是记录每一状态下Bob的获利,记录的是当前拥有令牌的人最大获利。逆推,最后dp[1]就是Bob的最大获益。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define MOD 1000000007 5 #define INF 0x3f3f3f3f 6 using namespace std; 7 typedef long long LL; 8 9 int n; 10 const int maxn = 51; 11 int add[maxn]; 12 int sum; 13 int dp[maxn]; 14 15 int main() { 16 scanf("%d", &n); 17 for (int i = 1; i <= n; i++) { 18 scanf("%d", &add[i]); 19 sum += add[i]; 20 add[i] += add[i - 1]; 21 } 22 dp[n] = sum - add[n - 1]; 23 for (int i = n; i >= 2; i--) { 24 dp[i - 1] = max(dp[i], sum - add[i - 2] - dp[i]); 25 } 26 printf("%d %d ", sum - dp[1], dp[1]); 27 return 0; 28 }