bzoj1663 [Usaco2006 Open]赶集

来源:互联网 发布:足球数据分析软件 编辑:程序博客网 时间:2024/04/29 06:27

这题目其实一点都不难,,问题是我一开始理解错题意了,以为必须要刚刚好到达,不能前也不能后,然后就蒙蔽了= =,想了各种做法都不会啊= =。
结果后来看题解发现原来还可以站在原地不动的= =这不就水了很多。
首先按照升序排序,这个明显,因为我们肯定要接先掉下来的。
然后设f[i]表示走到第i个点的最大答案,那么明显有f[i]=max(f[j]+1)
j满足条件p[j]+t[i][j]<=p[i]
n^2,都不用n^3= =。。

#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+5;int n,m;int f[N];int t[1005][1005];struct node{    int x,id;}a[N];int ans;bool cmp(node a,node b){    return a.x<b.x;} int main(){    scanf("%d",&n);    fo(i,1,n)    {        scanf("%d",&a[i].x);        a[i].id=i;    }    fo(i,1,n)    fo(j,1,n)scanf("%d",&t[i][j]);    sort(a+1,a+1+n,cmp);    fo(i,1,n)    {        if (t[1][a[i].id]<=a[i].x)f[i]=1;        fo(j,1,i-1)        if (a[j].x+t[a[j].id][a[i].id]<=a[i].x)f[i]=max(f[i],f[j]+1);        ans=max(ans,f[i]);    }    printf("%d\n",ans);}
阅读全文
0 0