首页 > 其他 > 详细

线性DP P1267

时间:2017-10-29 18:03:13      阅读:209      评论:0      收藏:0      [点我收藏+]

设f[i]表示从 i 到 n 时间内的最大空闲时间。 

则 f[i]=f[i+1]+1 (i=p[j]) 

f[i]=max{f[i],f[p[j]+t[j]]} (i<>p[j]) 

最后输出f[1]即可。设f[i]表示从 i 到 n 时间内的最大空闲时间。 

则 f[i]=f[i+1]+1 (i=p[j]) 

f[i]=max{f[i],f[p[j]+t[j]]} (i<>p[j]) 

最后输出f[1]即可。

#include<cstdio>

#...

P1267

设f[i]表示从 i 到 n 时间内的最大空闲时间。 

则 f[i]=f[i+1]+1 (i=p[j]) 

f[i]=max{f[i],f[p[j]+t[j]]} (i<>p[j]) 

最后输出f[1]即可。设f[i]表示从 i 到 n 时间内的最大空闲时间。 

则 f[i]=f[i+1]+1 (i=p[j]) 

f[i]=max{f[i],f[p[j]+t[j]]} (i<>p[j]) 

最后输出f[1]即可。

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<cmath>

#define F(i,s,e) for(int i=s;i<=e;i++)

#define D(i,e,s) for(int i=e;i>=s;i--)

using namespace std;

int p[10100],t[10100];

int f[10100];

int n,k;

int main()

{

    memset(f,0,sizeof(f));

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

    F(i,1,k)

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

    int j=k;

    D(i,n,0)

    {

        if(i!=p[j])

            f[i]=f[i+1]+1;

        else

        {

            while(i==p[j])

            {

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

j--;

}

        }

    }

    printf("%d\n",f[1]);

    return 0;

}

 

 

线性DP P1267

原文:http://www.cnblogs.com/Murs/p/7750498.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!