瞎扯
很经典的一道题
考前才打
我太菜了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 ",ans); 44 } 45 return 0; 46 }