poj2287 Tian Ji -- The Horse Racing

传送门

分析

这个题和传统的田忌赛马不一样的地方就是多了平局情况,所有我们不难想到要用dp。我们先将两人的马均降序排列,用dpij表示考虑前i匹马,田忌有几匹马是按从大到小的顺序从头取的(剩下的是从尾部取的)。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl;
int dp[1100][1100],a[1100],b[1100];
inline bool cmp(int x,int y){
      return x>y;
}
inline int c(int x,int y){
      if(x>y)return 200;
        else if(x<y)return -200;
      return 0;
}
int main(){
      int n,i,j;
      scanf("%d",&n);
      while(n!=0){
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)scanf("%d",&a[i]);
        for(i=1;i<=n;i++)scanf("%d",&b[i]);
        sort(a+1,a+n+1,cmp);
        sort(b+1,b+n+1,cmp);
        for(i=1;i<=n;i++){
          for(j=1;j<i;j++)
            dp[i][j]=max(dp[i-1][j-1]+c(a[j],b[i]),dp[i-1][j]+c(a[n-(i-j-1)],b[i]));
          dp[i][0]=dp[i-1][0]+c(a[n-i+1],b[i]);
          dp[i][i]=dp[i-1][i-1]+c(a[i],b[i]);
        }   
        int ans=-1000000007;
        for(i=0;i<=n;i++)
          ans=max(ans,dp[n][i]);
        printf("%d
",ans);
        scanf("%d",&n);
      }
      return 0;
}
原文地址:https://www.cnblogs.com/yzxverygood/p/9304563.html