【入门dp】E - Generate a String(字符串复制增加删除)

E - Generate a String

Time Limit:2000MS     Memory Limit:524288KB     64bit IO Format:%I64d & %I64u

Submit Status Practice CodeForces 710E

Description

zscoder wants to generate an input file for some programming competition problem.

His input is a string consisting of n letters ‘a‘. He is too lazy to write a generator so he will manually generate the input in a text editor.

Initially, the text editor is empty. It takes him x seconds to insert or delete a letter ‘a‘ from the text file and y seconds to copy the conte

nts of the entire text file, and duplicate it.

zscoder wants to find the minimum amount of time needed for him to create the input file of exactly n letters ‘a‘. Help him to determine

the amount of time needed to generate the input.

Input

The only line contains three integers n, x and y (1 ≤ n ≤ 107, 1 ≤ x, y ≤ 109) — the number of letters ‘a‘ in the input file and the paramete

rs from the problem statement.

Output

Print the only integer t — the minimum amount of time needed to generate the input file.

Sample Input

Input

8 1 1

Output

4

Input

8 1 10

Output

8

题意:要输入n个字符‘a‘,有两种操作,一种是输入或删除一个‘a‘,耗时x;另一种是把当前的整个文本复制粘贴,耗时y。求最少时间。

思路:每个长度都有几种方法得到:偶数--可以是他的一半复制得到,或者他前面的那个+1得到                           奇数--可以是他的一半复制再+1得到,或者他的一半+1复制再-1得到,或者他前面的+1得到     这种分段的,求最优的,有规律可循的就用dp

代码:
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int MAX=10000005;
    int main()
    {
        long long n,m,k,x,y,i;
        long long dp[MAX];
        scanf("%lld %lld %lld",&n,&x,&y);
        dp[1]=x;
        for(i=2;i<=n;i++)
        {
            if(i%2!=0)
            {
                dp[i]=min(dp[i-1]+x,min(dp[i/2]+x+y,dp[i/2+1]+x+y));
            }
            else
            {
                dp[i]=min(dp[i-1]+x,dp[i/2]+y);
            }
        }
        printf("%lld\n",dp[n]);
        return 0;
    }
时间: 2024-10-25 17:26:09

【入门dp】E - Generate a String(字符串复制增加删除)的相关文章

(一)Python入门-2编程基本概念:14字符串-转义字符-字符串拼接-字符串复制-input()获得键盘输入

一:转义字符 我们可以使用“\+特殊字符”,实现某些难以用字符表示的效果.比如:换行等.常见的 转义字符有这些: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \b 退格(Backspace) \n 换行 \t 横向制表符 \r 回车 [操作]测试转义字符的使用 1 >>> a = 'i\nlove\nu' 2 >>> a 3 'i\nlove\nu' 4 >>> print(a) 5 i 6 love

LeetCode | 1374. Generate a String With Characters That Have Odd Counts生成每种字符都是奇数个的字符串【Python】

LeetCode 1374. Generate a String With Characters That Have Odd Counts生成每种字符都是奇数个的字符串[Easy][Python][字符串] Problem LeetCode Given an integer n, return a string with n characters such that each character in such string occurs an odd number of times. The

C++入门经典-例6.20-修改string字符串的单个字符

1:使用+可以将两个string 字符串连接起来.同时,string还支持标准输入输出函数.代码如下: // 6.20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> using namespace std; int main() { string str1 = "您好,"; string str2; cout<<&

C++入门经典-例6.21-比较string字符串,比较两个字符串

1:使用">"."!=".">="等比较运算符可以比较两个字符串的内容.比较的方法是将两个string字符串从头开始比较每一个字符,直到出现两者不一致.比较这两个不相同的字符的字面值,得出相应的结果.代码如下: // 6.21.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> u

string字符串归档

1.请查看String.equals()方法的实现代码,注意学习其实现方法.equals所在位置: 在Object类当中,而Object是所有类的父类,包含在jdk里面,但并不适合绝大多数场景,通常需要重写 public boolean equals(Object obj) {        return (this == obj);    } equals的作用: 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型 equals的基本使用: boolean b =

hdu 2296 aC自动机+dp(得到价值最大的字符串)

Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3180    Accepted Submission(s): 1033 Problem Description For the hope of a forever love, Steven is planning to send a ring to Jane with a rom

String字符串详解

Java开发中,基本都会用户String,有些时候忘记了它还有某一个方法,或者以前没有使用到,而这些方法可能会节约很多时间.自己为了学习这些方法,决定对部分测试一下. 定义:String="atm"; System.out.println();//这里为打印结果 下面开始测试各个方法 char charAt(int index) 返回指定索引处的 char 值. System.out.println(a.charAt(0));//a int codePointAt(int index)

Go 从入门到精通(三)字符串,时间,流程控制,函数

一.strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirngs.HasSuffix(s string,suffix string) bool:判断字符串s是否以suffix结尾 strings.Index(s string,str string) int:判断str在s中首次出现的位置,如果没有出现,则返回-1 strings.LastIndex(s st

uva 674 (入门DP, 14.07.09)

 Coin Change  Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to make changes with these coins for a given amount of money. For example, if we have 11 cents, then we can make changes with one 10-cent coin an