排序后DP,注意要用long long 的地方。

//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<climits> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<set> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define pb(a) push_back(a) #define INF 0x1f1f1f1f #define lson idx<<1,l,mid #define rson idx<<1|1,mid+1,r #define PI 3.1415926535898 template<class T> T min(const T& a,const T& b,const T& c) { return min(min(a,b),min(a,c)); } template<class T> T max(const T& a,const T& b,const T& c) { return max(max(a,b),max(a,c)); } void debug() { #ifdef ONLINE_JUDGE #else freopen("d:\in.txt","r",stdin); // freopen("d:\out1.txt","w",stdout); #endif } int getch() { int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!=' ')return ch; } return EOF; } const int maxn=1001; const int mod=100000007; struct block { int a,b,c,d; bool operator < (const block &x) const { if(a!=x.a) return a<x.a; else if(b!=x.b) return b<x.b; else if(d!=x.d) return d>x.d; else return c>x.c; } }; block da[maxn]; ll dp[maxn]; ll f(int k,int n) { if(k>n)return 0; if(dp[k]>=0)return dp[k]; ll maxx=0; for(int i=k+1;i<=n;i++) { if(da[i].d==0){ if(da[i].a>=da[k].a&&da[i].b>=da[k].b) maxx=max(maxx,f(i,n)+da[i].c); }else if(da[i].d==1){ if(da[i].a>=da[k].a&&da[i].b>=da[k].b&&(ll)da[i].a*da[i].b>(ll)da[k].a*da[k].b) maxx=max(maxx,f(i,n)+da[i].c); }else if(da[i].d==2){ if(da[i].a>da[k].a&&da[i].b>da[k].b) maxx=max(maxx,f(i,n)+da[i].c); } } return dp[k]=maxx; } int main() { //freopen("in.txt","r",stdin); int n; da[0]=(block){0,0,0,0}; while(cin>>n&&n) { for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&da[i].a,&da[i].b,&da[i].c,&da[i].d); if(da[i].a<da[i].b)swap(da[i].a,da[i].b); } sort(da+1,da+1+n); memset(dp,-1,sizeof(dp)); ll num=f(0,n); cout<<num<<endl; } return 0; }