瞎扯
很经典的一道题
考前才打
我太菜了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 }
转载于:https://www.cnblogs.com/lincold/p/9879054.html
相关资源:JAVA上百实例源码以及开源项目
转载请注明原文地址: https://mac.8miu.com/read-72623.html