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

 

posted @ 2017-09-04 13:04  Blue233333  阅读(221)  评论(0编辑  收藏  举报