————————————————————————
我用了记忆化,因为它比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); }
---恢复内容结束---