[CF710E] Generate a String - dp,结论

[CF710E] Generate a String - dp,结论

Description

给定正整数 n,x,y,生成一个长度为 n 的字符串,有两种操作:添加或者删除一个字符代价为 x;将已有的字串翻倍代价为 y,求生成任意一个长度为 n 的字符串的最小代价。

Solution

性质:删除操作一定不会连续进行超过一次

所以我们把删除的情况手工枚举了,这样转移的拓扑结构就变成线性的了

具体地,当 i 是偶数时,转移来源为 \(i-1, \frac i 2\)

当 i 时奇数时,转移来源为 \(i-1, \frac {i+1} 2\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 10000005;

int f[N];
int n, x, y;

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n >> x >> y;
    for (int i = 1; i <= n; i++)
    {
        if (i & 1)
            f[i] = min(f[i - 1] + x, f[(i + 1) / 2] + x + y);
        else
            f[i] = min(f[i - 1] + x, f[i / 2] + y);
    }
    cout << f[n] << endl;
}
上一篇:2021-04-06


下一篇:产生数