bzoj1663 [Usaco2006 Open]赶集

这题目其实一点都不难,,问题是我一开始理解错题意了,以为必须要刚刚好到达,不能前也不能后,然后就蒙蔽了= =,想了各种做法都不会啊= =。
结果后来看题解发现原来还可以站在原地不动的= =这不就水了很多。
首先按照升序排序,这个明显,因为我们肯定要接先掉下来的。
然后设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);
}
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页