1. 程式人生 > >[Poj2287][Tyvj1048]田忌賽馬 (貪心+DP)

[Poj2287][Tyvj1048]田忌賽馬 (貪心+DP)

div color ret 很多 nbsp algo 一道 include money

瞎扯

很經典的一道題

考前才打

我太菜了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 }

[Poj2287][Tyvj1048]田忌賽馬 (貪心+DP)