您的位置:首页 > 其它

【动态规划】【记忆化搜索】CODEVS 3409 搬运礼物 CodeVS原创

2014-10-27 20:17 323 查看
考虑暴力递归求解的情况:

f(i)=min(a(i),f(i-1),f(i-2),...,f(1))

由于只要参数相同,f()函数的返回值是一样的,因此导致了大量的重复计算,所以我们可以记忆下来。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[5001],memory[5001];
int f(int cur)
{
if(memory[cur]!=-1) return memory[cur];
int res=a[cur];
for(int i=1;i<cur;i++)
res=min(res,a[cur-i]+f(i));
return memory[cur]=res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(memory,-1,sizeof(memory));
memory[1]=a[1];
printf("%d\n",f(n));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: