/* 最长路实现 */ #include <cstdio> #include <iostream> #include <memory.h> #include<queue> #include<set> #include<ctime> #include<algorithm> #include<cmath> #include<vector> #include<map> using namespace std; const int N=1009; const int MAXV=1009; const int MAXE=2000009; int n; struct point { int l,w,d; __int64 h; }p[N]; struct Dijkstra { typedef long long int64; static const int64 INF = (int64) (1) << 60; struct Edge { int v,next; int64 w; } ep[MAXE]; int e; int64 d[MAXV]; int vis[MAXV]; int first[MAXV]; int V; inline void init(int n) { V = n; memset(first,-1,sizeof(first)); e=0; } void addEdge(int u, int v, int64 dd) { ep[e].v=v; ep[e].w=dd; ep[e].next=first[u]; first[u]=e; e++; } void solve(int source) { for (int i = 0; i < V; i++){ d[i] = INF;vis[i]=0;} d[source] = 0; queue<int> q; q.push(source); vis[source]=1; while(!q.empty()) { int x=q.front();q.pop(); vis[x]=0; for(int k=first[x];k!=-1;k=ep[k].next) { if(d[ep[k].v]>d[x]+ep[k].w) { d[ep[k].v]=d[x]+ep[k].w; if(!vis[ep[k].v]) { vis[ep[k].v]=1; q.push(ep[k].v); } } } } } } g; int in[N]; bool cmp(point a,point b) { if(a.l!=b.l) return a.l<b.l; if(a.w!=b.w) return a.w<b.w; return a.d>b.d; } int main() { while(scanf("%d",&n),n) { //Map.clear(); g.init(n+2); memset(in,0,sizeof(in)); for(int i=0;i<n;i++) { scanf("%d%d%I64d%d",&p[i].l,&p[i].w,&p[i].h,&p[i].d); if(p[i].l<p[i].w) swap(p[i].l,p[i].w); } sort(p,p+n,cmp); for(int i=1;i<n;i++) { for(int j=0;j<i;j++) { if(p[i].d==0&&p[i].l>=p[j].l&&p[i].w>=p[j].w) { g.addEdge(j,i,-p[i].h); // cout<<i<<" t "<<j<<endl; in[i]++; } if(p[i].d==1&&((p[i].l>p[j].l&&p[i].w>=p[j].w)||(p[i].l>=p[j].l&&p[i].w>p[j].w))) { g.addEdge(j,i,-p[i].h); in[i]++; // cout<<i<<" tt "<<j<<endl; } if(p[i].d==2&&(p[i].l>p[j].l&&p[i].w>p[j].w)) { g.addEdge(j,i,-p[i].h); in[i]++; // cout<<i<<"ttt "<<j<<endl; } } g.addEdge(n,i,-p[i].h); g.addEdge(i,n+1,0); } __int64 ans=0; for(int i=0;i<n;i++) if(in[i]==0) { g.addEdge(n,i,-p[i].h); } g.solve(n); for(int i=0;i<n;i++) if(g.d[i]<ans) ans=g.d[i]; printf("%I64d\n",-ans); } } /* DP实现 */ #include <cstdio> #include <iostream> #include <memory.h> #include<queue> #include<set> #include<ctime> #include<algorithm> #include<cmath> #include<vector> #include<map> using namespace std; const int N=1009; const int MAXV=1009; const int MAXE=2000009; int n; struct point { int l,w,d; __int64 h; }p[N]; __int64 dp[N]; bool cmp(point a,point b) { if(a.l!=b.l) return a.l<b.l; if(a.w!=b.w) return a.w<b.w; return a.d>b.d; } int main() { while(scanf("%d",&n),n) { for(int i=0;i<n;i++) { scanf("%d%d%I64d%d",&p[i].l,&p[i].w,&p[i].h,&p[i].d); if(p[i].l<p[i].w) swap(p[i].l,p[i].w); } sort(p,p+n,cmp); for(int i=0;i<n;i++) dp[i]=p[i].h; for(int i=1;i<n;i++) { for(int j=0;j<i;j++) { if(p[i].d==0&&p[i].l>=p[j].l&&p[i].w>=p[j].w) { dp[i]=max(dp[i],dp[j]+p[i].h); } if(p[i].d==1&&((p[i].l>p[j].l&&p[i].w>=p[j].w)||(p[i].l>=p[j].l&&p[i].w>p[j].w))) { dp[i]=max(dp[i],dp[j]+p[i].h); } if(p[i].d==2&&p[i].l>p[j].l&&p[i].w>p[j].w) { dp[i]=max(dp[i],dp[j]+p[i].h); } } } __int64 ans=0; for(int i=0;i<n;i++) ans=max(ans,dp[i]); cout<<ans<<endl; } }