【动态规划】【记忆化搜索】CODEVS 3409 搬运礼物 CodeVS原创
考虑暴力递归求解的情况:
f(i)=min(a(i),f(i-1),f(i-2),...,f(1))
由于只要参数相同,f()函数的返回值是一样的,因此导致了大量的重复计算,所以我们可以记忆下来。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int n,a[5001],memory[5001]; 6 int f(int cur) 7 { 8 if(memory[cur]!=-1) return memory[cur]; 9 int res=a[cur]; 10 for(int i=1;i<cur;i++) 11 res=min(res,a[cur-i]+f(i)); 12 return memory[cur]=res; 13 } 14 int main() 15 { 16 scanf("%d",&n); 17 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 18 memset(memory,-1,sizeof(memory)); 19 memory[1]=a[1]; 20 printf("%d\n",f(n)); 21 return 0; 22 }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步