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 }