Gym 101485D 记忆化搜索

来源:互联网 发布:workbench网络培训平台 编辑:程序博客网 时间:2024/05/19 14:36

题意

有N行代码,有1个BUG,可以在行之间输出信息,编写输出信息需要时间,运行需要时间。假设找到BUG是在最坏的情况下,问最少需要多少时间才能找到BUG。

题解

对于大于一行的代码,我们也不知道怎么输出多少信息才能最快找到BUG,索性暴力吧。暴力枚举将代码分成2-N块的情况,记忆化搜索一下,选择找到BUG的最小时间,输出就可以了。

代码

#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<string>#include<set>#include<map>#include<bitset>#include<stack>#include<string>#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)#define W(a) while(a)#define MEM(a,b) memset(a,b,sizeof(a))#define LL long long#define INF 0x3f3f3f3f3f3f3f3f#define MAXN 120050#define MOD 1000000007#define EPS 1e-3#define int LLusing namespace std;int dp[1000100];int n,r,p;int solve(int u){    if(u<2) return 0;    if(dp[u]) return dp[u];    int t=(u-1)*p;    UP(i,2,u) t=min(t,solve(ceil((double)u/i))+(i-1)*p);    return dp[u]=t+r;}main(){    scanf("%I64d%I64d%I64d",&n,&r,&p);    printf("%I64d\n",solve(n));}
原创粉丝点击