分析
这个题和传统的田忌赛马不一样的地方就是多了平局情况,所有我们不难想到要用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\n",ans); scanf("%d",&n); } return 0; }
原文地址:https://www.cnblogs.com/yzxverygood/p/9304563.html
时间: 2024-11-08 23:57:31