POJ 1678 I Love this Game

题目链接:http://poj.org/problem?id=1678

动态博弈。用dp[i]来表示如果先行者首先选择第i个数字的话能取得的最大差值。由于每次选择的数字一定比上一次选择的数字大,所以先对数组进行排序。然后对于每个数字,如果先行者首先选择这个数字的话,dp[i] 初始化的值为num[i].然后在num[i]之后的序列中,如果有符合条件的数字的话,那么选择dp值最大的那个数字。最后对所有的数字进行for loop,寻找符合条件的并且差值最大的数字。代码如下:

 1 //============================================================================
 2 // Name        : test.cpp
 3 // Author      :
 4 // Version     :
 5 // Copyright   : Your copyright notice
 6 // Description : Hello World in C++, Ansi-style
 7 //============================================================================
 8
 9 #include <iostream>
10 #include <math.h>
11 #include <stdio.h>
12 #include <cstdio>
13 #include <algorithm>
14 #include <string.h>
15 #include <string>
16 #include <sstream>
17 #include <cstring>
18 #include <queue>
19 #include <vector>
20 #include <functional>
21 #include <cmath>
22 #include <set>
23 #define SCF(a) scanf("%d", &a)
24 #define IN(a) cin>>a
25 #define FOR(i, a, b) for(int i=a;i<b;i++)
26 #define Infinity 999999999
27 #define NInfinity -999999999
28 #define PI 3.14159265358979323846
29 typedef long long Int;
30 using namespace std;
31
32 int main()
33 {
34     int t;
35     int n, a, b;
36     SCF(t);
37     int num[10005];
38     int dp[10005];
39     while (t--)
40     {
41         SCF(n);
42         SCF(a);
43         SCF(b);
44         FOR(i, 0, n)
45             SCF(num[i]);
46
47         sort(num, num + n);
48
49         for (int i = n - 1; i >= 0; i--)
50         {
51             dp[i] = num[i];
52             bool first = true;
53             int maxNum = 0;
54             for (int j = i + 1; j < n; j++)
55             {
56                 int diff = num[j] - num[i];
57                 if (diff >= a && diff <= b)
58                 {
59                     if (first)
60                     {
61                         maxNum = dp[j];
62                         first = false;
63                     }
64                     else
65                         maxNum = max(maxNum, dp[j]);
66                 }
67             }
68             dp[i] = dp[i] - maxNum;
69         }
70         int maxAns = 0;
71         bool found = false;
72         for (int i = n - 1; i >= 0; i--)
73         {
74             if (num[i] >= a && num[i] <= b)
75             {
76                 if (!found)
77                 {
78                     maxAns = dp[i];
79                     found = true;
80                 }
81                 else
82                 {
83                     if (dp[i] > maxAns)
84                         maxAns = dp[i];
85                 }
86             }
87         }
88         printf("%d\n", maxAns);
89     }
90     return 0;
91 }
时间: 2024-10-04 23:55:39

POJ 1678 I Love this Game的相关文章

poj 1678 I Love this Game!(博弈dp)

I Love this Game! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1892   Accepted: 723 Description A traditional game is played between two players on a pool of n numbers (not necessarily distinguishing ones). The first player will choos

博弈论题目总结(一)——组合游戏

人类的本质是什么呢?复读机?鸽子? 博弈问题是很有意思的一类题目 我讲的可能不是很明白,但题目都不难建议自己思考 组合游戏的特点: 1.两个人博弈,轮流做出最优决策 2.玩家在每个时刻做出的决策都是能预测到的,是一个确定的集合 3.每种状态可能有多种方式到达,但同一种状态不能在一次游戏中重复到达,且没有平局的情况 4.只要能进行决策,就一定要决策,不能跳过这个回合 SG组合游戏 我们把每种状态抽象成一个点,在起点有一颗棋子,两个人选取最优策略轮流对这颗棋子进行移动,最后不能移动棋子的人失败 显然

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+