求生成n个字符a至少需要多长时间。
我们用dp[i]表示生成i个字符需要时间当i是偶数时,dp[i]=min(dp[i-1]+x,dp[i/2]+y)(增加或复制); 当i为奇数时,dp[i]=min(dp[i-1]+x,dp[(i+1)/2]+x+y)(增加或复制和删除)。
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<stack>
#include<vector>
#include<string.h>
#include<map>
#define INF 0x3f3f3f3f3f
using namespace std;
long long dp[10000009];
int main()
{
int n;
long long x,y;
scanf("%d%I64d%I64d",&n,&x,&y);
dp[0]=0;
dp[1]=x;
for(int i=2;i<=n;i++)
{
if(i%2==0)
dp[i]=min(dp[i-1]+x,dp[i/2]+y);
else
dp[i]=min(dp[i-1]+x,dp[i/2+1]+y+x);
}
printf("%I64d\n",dp[n]);
}