# HDU 1052 贪心+dp

http://acm.hdu.edu.cn/showproblem.php?pid=1052

# Tian Ji -- The Horse Racing

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 31270    Accepted Submission(s): 9523

Problem Description

Here is a famous story in Chinese history.

"That
was about 2300 years ago. General Tian Ji was a high official in the
country Qi. He likes to play horse racing with the king and others."

"Both
of Tian and the king have three horses in different classes, namely,
regular, plus, and super. The rule is to have three rounds in a match;
each of the horses must be used in one round. The winner of a single
round takes two hundred silver dollars from the loser."

"Being
the most powerful man in the country, the king has so nice horses that
in each class his horse is better than Tian‘s. As a result, each time
the king takes six hundred silver dollars from Tian."

"Tian Ji
was not happy about that, until he met Sun Bin, one of the most famous
generals in Chinese history. Using a little trick due to Sun, Tian Ji
brought home two hundred silver dollars and such a grace in the next
match."

"It was a rather simple trick. Using his regular class
horse race against the super class from the king, they will certainly
lose that round. But then his plus beat the king‘s regular, and his
super beat the king‘s plus. What a simple trick. And how do you think of
Tian Ji, the high ranked official in China?"

Were
Tian Ji lives in nowadays, he will certainly laugh at himself. Even
more, were he sitting in the ACM contest right now, he may discover that
the horse racing problem can be simply viewed as finding the maximum
matching in a bipartite graph. Draw Tian‘s horses on one side, and the
king‘s horses on the other. Whenever one of Tian‘s horses can beat one
from the king, we draw an edge between them, meaning we wish to
establish this pair. Then, the problem of winning as many rounds as
possible is just to find the maximum matching in this graph. If there
are ties, the problem becomes more complicated, he needs to assign
weights 0, 1, or -1 to all the possible edges, and find a maximum
weighted perfect matching...

However, the horse racing problem is
a very special case of bipartite matching. The graph is decided by the
speed of the horses --- a vertex of higher speed always beat a vertex of
lower speed. In this case, the weighted bipartite matching algorithm is
a too advanced tool to deal with the problem.

In this problem, you are asked to write a program to solve this special case of matching problem.

Input

The
input consists of up to 50 test cases. Each case starts with a positive
integer n (n <= 1000) on the first line, which is the number of
horses on each side. The next n integers on the second line are the
speeds of Tian’s horses. Then the next n integers on the third line are
the speeds of the king’s horses. The input ends with a line that has a
single 0 after the last test case.

Output

For each input case, output a line containing a single number, which is the maximum money Tian Ji will get, in silver dollars.

Sample Input

3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0

Sample Output

200
0
0

``` 1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<algorithm>
5 #include<vector>
6 using namespace std;
7 #define inf 0x3f3f3f3f
8 int f[1005][1005];
9 int a[1005],b[1005];
10 int cmp(int i,int j)
11 {
12     if(a[i]>b[j])return 1;
13     if(a[i]==b[j])return 0;
14     return -1;
15 }
16 int main()
17 {
18     int N,M,i,j,k;
19     while(cin>>N&&N){
20         for(i=1;i<=N;++i) scanf("%d",a+i);
21         for(i=1;i<=N;++i) scanf("%d",b+i);
22         memset(f,0,sizeof(f));
23         sort(a+1,a+1+N);
24         sort(b+1,b+1+N);
25         for(i=1;i<=N;++i) f[i][i]=cmp(i,1);
26         for(int len=2;len<=N;++len)
27         {
28             for(i=1,j=len;j<=N;++i,++j)
29             {
30                 f[i][j]=max(f[i+1][j]+cmp(i,j-i+1),f[i][j-1]+cmp(j,j-i+1));
31             }
32         }
33         printf("%d\n",f[1][N]*200);
34     }
35     return 0;
36 }```

## hdu 1052 贪心

// 判断出(田忌)的必胜局面和必败局面,则可以容易的得到决策方案 // 若没有明显的必胜局面和必败局面,则使用田忌赛马的策略 1 #include "bits/stdc++.h" 2 using namespace std; 3 int N; 4 int v1[1010], v2[1010]; 5 6 int main() 7 { 8 while(scanf("%d", &N) && N) { 9 int i, j; 10 for(i =

## HDU 4939 Stupid Tower Defense（贪心+dp)

HDU Stupid Tower Defense 题目链接 题意:有一些塔,红塔能攻击经过他的,绿塔能攻击经过之后的,蓝塔能把经过之后的减速,求在1-n上放塔,求伤害最大值 思路:一开始以为直接贪心,绿塔最前,蓝塔中间,红塔最后就可以了,结果其实是错的 不过,红塔放最后是肯定的,这个很显然就不多证明了,是贪心的思想 然后就dp[i][j]表示放到i,前面有j个绿塔去状态转移即可 代码: #include <cstdio> #include <cstring> #include &l

## hdu 1052(田忌赛马 贪心算法，sort排序)

Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18155    Accepted Submission(s): 5281 Problem Description Here is a famous story in Chinese history. "That was about

## hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea

## hdu 3853 概率DP 简单

http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有R*C个格子,一个家伙要从(0,0)走到(R-1,C-1) 每次只有三次方向,分别是不动,向下,向右,告诉你这三个方向的概率,以及每走一步需要耗费两个能量,问你走到终点所需要耗费能量的数学期望: 回头再推次,思想跟以前的做过的类似 注意点:分母为0的处理 #include <cstdio> #include <cstring> #include <algorithm>

## HDU 4968 (水dp 其他？)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

## hdu 4123 树形DP+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=4123 Problem Description Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses,