BZOJ1663: [Usaco2006 Open]赶集

Posted Blue233333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1663: [Usaco2006 Open]赶集相关的知识,希望对你有一定的参考价值。

n<=400个地点第Ai秒会出礼物,给一个邻接矩阵描述地点间的路径耗时,去下一个地点只能走直接相连的路径(不一定最短路),求最多能拿多少。

有点水的DP。。f[i]表示去拿第i个(时间顺序)礼物最多能拿多少,f[i]=max(f[j]+1),其中时间允许从j走到i。

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<algorithm>
 5 //#include<iostream>
 6 using namespace std;
 7 
 8 int n;
 9 #define maxn 411
10 struct Point
11 {
12     int t,id;
13     bool operator < (const Point &b) const {return t<b.t;}
14 }a[maxn];
15 int g[maxn][maxn],f[maxn];
16 const int inf=0x3f3f3f3f;
17 int main()
18 {
19     scanf("%d",&n);
20     for (int i=1;i<=n;i++) scanf("%d",&a[a[i].id=i].t);
21     for (int i=1;i<=n;i++)
22         for (int j=1;j<=n;j++)
23             scanf("%d",&g[i][j]);
24     sort(a+1,a+1+n);int ans=0;
25     for (int i=1;i<=n;i++)
26     {
27         if (g[1][a[i].id]<=a[i].t) f[i]=1;else f[i]=-inf;
28         for (int j=1;j<i;j++) if (g[a[j].id][a[i].id]+a[j].t<=a[i].t) f[i]=max(f[i],f[j]+1);
29         ans=max(ans,f[i]);
30     }
31     printf("%d\n",ans);
32     return 0;
33 }
View Code

 

以上是关于BZOJ1663: [Usaco2006 Open]赶集的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1663] [Usaco2006 Open]赶集(spfa最长路)

BZOJ1665 Usaco2006 Open The Climbing Wall

bzoj1664: [Usaco2006 Open]County Fair Events 参加节日庆祝

BZOJ1727: [Usaco2006 Open]The Milk Queue 挤奶队列

bzoj 1688: [Usaco2005 Open]Disease Manangement 疾病管理

BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚