P2690 接苹果

————————————————————————

 

我用了记忆化,因为它比DP更好理解

 

—————————————————————————

资料:百度百科( MIKU,I Love HER )

  来自洛谷:(背包的题解)//侵权删

 

——————————————————————————

 

分析:不会dp怎么办,记忆化来代替

(oi笼罩在一片痛苦中,神说:让dp诞生吧,oi更加痛苦了)

 

——————————————————————————

 

原题链接;P2690

 

—————————————————————————

 

代码:↓

/*
welcome

这里是记忆化搜索,// 别问我是什么,我是蒟蒻 

其实记忆化和动态规划很像,真的很像,但是,记忆化比较好想

毕竟它还是DFS 

*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,w;//总时间和总步数 
int zong[100000];//苹果位置 
int dp[10000][100];//记忆化也 
int dfs(int step,int now,int time){//既然是记忆化,就要把这些变量 全列上 
    if(time>t)//边界——超时 
    return 0;
    if(-1!=dp[time][step]) return dp[time][step];//记忆部分 
    if(zong[time]==now)//苹果在当前的树上 
    return dp[time][step]=dfs(step,now,time+1)+1;//直接加一即可 
    else
    {
    if(step<w)//如果能动 
    return dp[time][step]=max(dfs(step+1,-1*now+3,time+1)+1,dfs(step,now,time+1));//就计算动和不动的最大值 
    else
    return dp[time][step]=dfs(step,now,time+1); //动不了了 
    }
}


int main()
{
    //初始化和读入 
memset(dp,-1,sizeof(dp));
    cin>>t>>w;
    for(int i=1;i<=t;++i)
    cin>>zong[i];
    cout<<dfs( 0,1,1);
}

 

 

 

 

---恢复内容结束---

posted @ 2019-05-10 21:44  Simex  阅读(219)  评论(0编辑  收藏  举报