[Poj2287][Tyvj1048]田忌赛马 (贪心+DP)

瞎扯

很经典的一道题

考前才打

我太菜了QAQ

就是先贪心排序了好

然后在DP

这样比直接DP更容易理解

(其实这题做法还有很多)

代码

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 1005
 5 using namespace std;
 6 int n,money,t[N],q[N];
 7 int f[N][N];
 8 bool cmp(int a,int b)
 9 {
10     return a>b;
11 }
12 int cpt(int i,int j){
13     if(t[i]>q[j]) return 200;
14     else if(t[i]==q[j]) return 0;
15     return -200;
16 }
17 int main()
18 {
19     int i,j,ans=-999999999;
20     while(scanf("%d",&n)==1&&n){
21         memset(f,0,sizeof(f));
22         memset(t,0,sizeof(t));
23         memset(q,0,sizeof(q));
24         ans=-99999999;
25         for(int i=1;i<=n;i++){
26             scanf("%d",&t[i]);
27         }
28         for(int i=1;i<=n;i++){
29             scanf("%d",&q[i]);
30         }
31         sort(q+1,q+1+n,cmp);
32         sort(t+1,t+1+n,cmp);
33         for(int i=1;i<=n;i++){
34             f[i][j]=f[i-1][j-1]+cpt(i,i);
35             f[i][0]=f[i-1][0]+cpt(n-i+1,i);
36             for(int j=1;j<=n;j++){
37                 f[i][j]=max(f[i-1][j-1]+cpt(j,i),f[i-1][j]+cpt(n-(i-j)+1,i));
38             }
39         }
40         for(int j=0;j<=n;j++){
41             if(ans<f[n][j]) ans=f[n][j];
42         }
43         printf("%d\n",ans);
44     }
45     return 0;
46 }

猜你喜欢

转载自www.cnblogs.com/fsy2017/p/9879054.html