DP

Posted on 2017-10-29 17:15  Murs  阅读(138)  评论(0)    收藏  举报

三道动归基础。。。

P1255

#include<cstdio>

#include<algorithm>

#include<cstring>

using namespace std;

int n,a[120];

int fs[120],fe[120];

int main()

{

    memset(a,0,sizeof(a));

    memset(fs,0,sizeof(fs));

    memset(fe,0,sizeof(fe));

    scanf("%d",&n);

    for(int i=1;i<=n;i++)

    scanf("%d",&a[i]);

    for(int i=1;i<=n;i++)//fs头到末

    {

        for(int j=0;j<i;j++)

            if(a[i]>a[j]&&fs[i]<fs[j])

                fs[i]=fs[j];

        fs[i]++;

    }

    for(int i=n;i>=1;i--)//fe未到头

    {

        for(int j=n+1;j>i;j--)

            if(a[i]>a[j]&&fe[i]<fe[j])

                fe[i]=fe[j];

        fe[i]++;

    }

    int minn=200000;

    for(int i=1;i<=n;i++)//因为fs和fe是从头到尾和从未到头的方案所以temp=n-fs-fe就表示剩余的数目及出列的人数

    {

        int temp=n-fs[i]-fe[i]+1;

        if(temp<minn)

            minn=temp;

    }

    printf("%d\n",minn);

    return 0;

 

}

P1256

#include<cstdio>

#include<cmath>

#include<cstring>

#include<algorithm>

using namespace std;

int ans=0,f[5100];

int n,s;

struct kkk

{

    int x,y,t;

}apples[5100];

bool cmp(kkk a,kkk b)

{

    return (a.t<b.t);

}

double dis(int k,int h)

{

    double temp=sqrt(1.0*(apples[k].x-apples[h].x)*(apples[k].x-apples[h].x)+1.0*(apples[k].y-apples[h].y)*(apples[k].y-apples[h].y));

    return temp;

}

void work()

{

    sort(apples+1,apples+1+n,cmp);//以时间排序

    memset(f,-1,sizeof(f));//复位不合法

    f[0]=0;

    for(int i=1;i<=n;i++)

    {

        for(int j=0;j<i;j++)

            if((f[j]>=0)&&((apples[i].t-apples[j].t)*s>=dis(i,j)))//合法且在时间内能到达

                f[i]=max(f[i],f[j]+1);

            ans=max(ans,f[i]);

    }

    printf("%d\n",ans);

 

}

int main()

{

    scanf("%d%d",&n,&s);

    for(int i=1;i<=n;i++)

        scanf("%d%d%d",&apples[i].x,&apples[i].y,&apples[i].t);

    work();

    return 0;

}

注意distance是关键字