给定n,和三个操作,加一个a和减去一个a用时x,翻倍用时y
问从空构造到n最少耗时
乍一看就想到了dp,但是比较明显的是-1这个操作是不满足无后效性的
但是我们其实也可以比较容易想到
对于任意一个状态n
如果这个n是偶数 那么显然 dp[n]=min(dp[n-1]+x,dp[n/2]+y);
如果这个n是奇数 那么 dp[n]=min(dp[n-1]+x,dp[(n+1)/2]+y+x);
那么合并状态转移方程得到 dp[n]=min(dp[n-1]+x,dp[(n+1)/2]+(n&1)*x)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define sp system("pause")
typedef long long ll;
typedef pair<int, int> pii;
const int MAXN = 10000000 + 100;
ll x, y, n;
ll dp[MAXN ];
int main()
{
cin >> n >> x >> y;
memset(dp, -1, sizeof dp);
dp[0] = 0;
//dp[1] = x;
for (int i = 1; i <= n; i++)
{
dp[i] = min(dp[i - 1] + x, dp[(i + 1) / 2] + y + (i & 1)*x);
}
cout << dp[n] << endl;
//sp;
}