/*
最长路实现
*/
#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;
}
}
HDU 4001 To Miss Our Children Time 最长路, DP
最新推荐文章于 2017-01-28 13:40:25 发布