hrbust 1186 简单DP

来源:互联网 发布:仙界网络直播间sodu 编辑:程序博客网 时间:2024/06/11 20:42

递归的方法会超时。

只有靠递推解决。

递推:

#include<cstdio>#include<cstring>int l,s,t,n;int DP[100010]={};int main(){    while(~scanf("%d%d%d%d",&l,&s,&t,&n))    {        memset(DP,0,sizeof(DP));        for(int i=1;i<=n;i++)        {            int temp;            scanf("%d",&temp);            DP[temp]=1;        }        int ans=0;        for(int i=l-t;i>=0;i--)        {            int temp=DP[i+s];            for(int j=s+1;j<=t;j++)            {                if(DP[i+j]<temp) temp=DP[i+j];            }            DP[i]+=temp;        }        printf("%d\n",DP[0]);    }    return 0;}

递归:

#include<cstdio>#include<cstring>int l,s,t,n;int DP[100010]={};bool stone[100001]={};int dp(int g){    if(DP[g]!=0) return DP[g];    if(stone[g]==1) DP[g]+=1;    if(g+t>=l) return DP[g];    int key=dp(g+s);    for(int i=s+1;i<=t;i++)    {        int temp=dp(g+i);        if(temp<key) key=temp;    }    DP[g]+=key;    return DP[g];}int main(){    while(~scanf("%d%d%d%d",&l,&s,&t,&n))    {        memset(DP,0,sizeof(DP));        memset(stone,0,sizeof(stone));        for(int i=1;i<=n;i++)        {            int temp;            scanf("%d",&temp);            stone[temp]=1;        }        printf("%d\n",dp(0));    }    return 0;}


0 0
原创粉丝点击