poj 2287 动态规划
用贪心简单证明之后就是一个从两头取的动态规划
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e3+9; int a[maxn],b[maxn]; int dp[maxn][maxn]; bool cmp(int a,int b) { return a>b; } int main() { int n; while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); sort(a+1,a+1+n,cmp); sort(b+1,b+1+n,cmp); memset(dp,200,sizeof(dp)); dp[0][0]=0; for(int i=0;i<=n;i++) for(int j=0;j+i<n;j++) { if(a[i+1]>b[i+j+1]) dp[i+1][j]=max(dp[i+1][j],dp[i][j]+200); else if(a[i+1]<b[i+j+1]) dp[i+1][j]=max(dp[i+1][j],dp[i][j]-200); else dp[i+1][j]=max(dp[i+1][j],dp[i][j]); if(a[n-j]>b[i+j+1]) dp[i][j+1]=max(dp[i][j+1],dp[i][j]+200); else if(a[n-j]<b[i+j+1]) dp[i][j+1]=max(dp[i][j+1],dp[i][j]-200); else dp[i][j+1]=max(dp[i][j+1],dp[i][j]); } int ans=-1e7; for(int i=0;i<=n;i++) ans=max(ans,dp[i][n-i]); cout<<ans<<endl; } return 0; }